【Ruby on Rails全栈课程】2.3 ruby的数据类型--字符串(String)、区间(Range)

简介: 1、字符串(String)字符串是String类的对象。分为单引号字符串和双引号字符串。双引号字符串能支持较多的转义字符以及支持字符串#{}q嵌入变量。实际开发中多用双引号字符串。(1)字符串嵌入变量用#{ },这个是ruby特有的,经常使用的一个功能。只支持双引号的字符串。

1、字符串(String)


字符串是String类的对象。分为单引号字符串和双引号字符串。双引号字符串能支持较多的转义字符以及支持字符串#{}q嵌入变量。实际开发中多用双引号字符串。


(1)字符串嵌入变量用#{ },这个是ruby特有的,经常使用的一个功能。只支持双引号的字符串。


irb(main):013:0> name = "Mary"
=> "Mary"
irb(main):014:0> puts "你好,我是#{name}"
你好,我是Mary


#{ }里面不仅可以放变量,还可以放表达式。输出结果会显示表达式的结果


irb(main):016:0> x = 1
=> 1
irb(main):017:0> y = 2
=> 2
irb(main):018:0> puts "x加y等于#{x+y}"
x加y等于3


2、类型转换


(1)数字转字符串:to_s


irb(main):019:0> 1.2.to_s
=> "1.2"


(2)字符串转整型:to_i,只会保留字符串里面数字的整数部分


irb(main):021:0> "1.2".to_i
=> 1
irb(main):022:0> "1.2你好,世界".to_i
=> 1


(3)字符串转浮点型:to_f,如果字符串的开头为数字,则转换后的值为字符串开头的数字。如果字符串的开头不是数字,则转换后的值为0.0


irb(main):023:0> "1.2".to_f
=> 1.2
irb(main):024:0> "1.2abc5.6".to_f
=> 1.2
irb(main):025:0> "abc5.6".to_f
=> 0.0


(4)字符串转分子式:to_r


irb(main):026:0> "200/2".to_r
=> (100/1)
irb(main):027:0> "1.2".to_r
=> (6/5)
irb(main):028:0> "12345".to_r
=> (12345/1)
irb(main):029:0> "-9.2e2".to_r
=> (-920/1)


(5)字符串转符号:to_sym。符号也是ruby数据类型的一种,后面会单独介绍


irb(main):030:0> "hello".to_sym
=> :hello


3、操作字符串


(1)str % arg 格式化输出。


不同类型占位符如下所示:


image.png


image.png

irb(main):041:0> age = 22
=> 22
irb(main):042:0> name = "Mary"
=> "Mary"
irb(main):043:0> salary = "8000.78"
=> "8000.787"
#%s给name字符串占位,%d给age整数占位,%f给salary浮点数占位
irb(main):044:0> puts "my name is %s, my age is %d, my salary is %f" % [name,age,salary]
=>my name is Mary, my age is 22, my salary is 8000.787000


当然如果仅仅是将变量显示在字符串里面的话,咱们还是用字符串内嵌#{}功能比较好,但是我们想要将这些变量进行一些处理再显示,用占位符就比较方便了。比如想要在name后面加7个空格,age前面加5个空格,salary保留两位小数,可以像下面这样写


puts "my name is %-7s, my age is %5d, my salary is %.2f" % [name,age,salary]
=>my name is Mary   , my age is    22, my salary is 8000.78


占位符比较常用的功能就是限制数字的小数位数,在项目中会经常用到


irb(main):049:0> num = 12345.678
=> 12345.678
irb(main):050:0> "%.1f" % num
=> "12345.7"


(2)str * num 字符串乘以一个整数,会得到num个str


irb(main):052:0> "str"*3
=> "strstrstr"
irb(main):053:0> "str"*0
=> ""


(3)str + str1 两个字符串相加,相当于拼接两个字符串。

值得注意的是,如果要拼接数字的话,需要将数字转换成字符串(to_s方法),再做拼接


irb(main):057:0> age = 22
=> 22
irb(main):058:0> name = "Mary"
=> "Mary"
irb(main):059:0> puts "I am " + name + " my age is " + age.to_s
I am Mary my age is 22


(4)== 判断两个字符串是否相等,相等返回true,否则返回false


(5)str.length 获取字符串的长度。中文字符的长度和英文字符一样,都是1。


irb(main):060:0> "Hello".length
=> 5
irb(main):061:0> "我爱我家".length
=> 4


(6)通过索引截取字符串,索引从0开始


str[n] 取索引数为n的字符,索引从0开始数


str[n, length] 从索引数为n的字符开始,取length个字符


str[start…end] 取索引数为start到end之间的值,包含索引为end的字符,涉及到范围(Range)知识点,先了解,后面会讲


str[start…end] 取索引数为start到end之间的值,不包含索引为end的字符


irb(main):062:0> str = "HelloWorld"
=> "HelloWorld"
#索引0,代表第一个字符,为H
irb(main):063:0> str[0]
=> "H"
irb(main):064:0> str[1]
=> "e"
#从索引为2的字符开始(即第3个字符),取3个字符
irb(main):066:0> str[2,5]
=> "lloWo"
#从索引为2的字符开始,到索引为5的字符,包含索引为5的字符
irb(main):067:0> str[2..5]
=> "lloW"
#从索引为2的字符开始,到索引为5的字符,不包含索引为5的字符
irb(main):068:0> str[2...5]
=> "llo"


(7)str.capitalize和 str.capitalize! 将str的第一个字符转换成大写,其他字符转换成小写。


capitalize和capitalize!的区别是:


capitalize不改变str的值,只是返回值为首字母为大写的字符


capitalize!会改变str的值,并且返回首字母为大写的字符


irb(main):069:0> a = "HELLO"
=> "HELLO"
irb(main):070:0> a.capitalize
=> "Hello"
irb(main):071:0> a
#a还是原先的值
=> "HELLO"
irb(main):072:0> a.capitalize!
=> "Hello"
irb(main):073:0> a
#a的值已经改变了
=> "Hello"


(8)str.chars 返回组成str的字符的数组形式


irb(main):074:0> "Hello".chars
=> ["H", "e", "l", "l", "o"]


(9)str.delete(str1,…) 删除掉str和str1相同的部分。如果括号里面有多个参数,则这多个参数的交集会被删除。delete!和delete之间的区别和前面一样,方法后面加叹号,会改变字符串本身。


irb(main):075:0> "Hello".delete("l")
=> "Heo"
#"l"和"H"没有交集的部分,所以不会删除任何字符
irb(main):076:0> "Hello".delete("l","H")
=> "Hello"
#"Hl","He"的交集部分为"H",所以会删掉"H"字符
irb(main):077:0> "Hello".delete("Hl","He")
=> "ello"


(10)str.downcase 将str的字符全部转换为小写


(11)str.upcase 将str的字符全部转换为大写


irb(main):081:0> str = "HEllo"
=> "HEllo"
irb(main):082:0> str.downcase
=> "hello"
irb(main):083:0> str.upcase
=> "HELLO"


(12)str.end_with?(str1,…) 判断str是否以str1等参数中的任意一个结尾,是的话,返回true,否则的话为false


(13)str.start_with?(str1,…),判断str是否以str1等参数中的任意一个开头,是的话,返回true,否则的话为false


irb(main):084:0> "Hello".end_with?("llo")
=> true
irb(main):085:0> "Hello".end_with?("Horizon","llo")
=> true
irb(main):086:0> "Hello".start_with?("Hel")
=> true
irb(main):087:0> "Hello".start_with?("el","lo")
=> false


(14)str.gsub(a,b),将str中的a用b代替。a可以是正则表达式,正则表达式我们之后会讲

irb(main):088:0> "HelloWorld".gsub("l","o")
=> "HeoooWorod"


(15)str.include?(str1) 判断str中是否包含str1,包含的话,返回true,不包含的话,返回false


=> "Hello,my name is Mary"
irb(main):090:0> str.include?("hel")
=> false
irb(main):091:0> str.include?("Hel")
=> true


(16)str.index(a) 返回str中a字符的索引位置,如果str中有多个a字符,则返回第一个字符所在的位置。如果str中没有a字符,返回nil


irb(main):093:0> "Hello".index("o")
=> 4
irb(main):094:0> "Hello".index("2")
=> nil


(17)strip去除字符串两侧空格


strip、strip! 将字符串左右两侧空格去掉,不会去掉字符串中间的空格


lstrip、lstrip! 将字符串左两侧空格去掉


rstrip、rstrip! 将字符串右两侧空格去掉


irb(main):097:0> str.strip
=> "h  e llo"
irb(main):098:0> str.lstrip
=> "h  e llo       "
irb(main):099:0> str.rstrip
=> "       h  e llo"


(18)str.split 分割字符串


irb(main):100:0> str = "Hello My name is Mary"
=> "Hello My name is Mary"
irb(main):101:0> str.split(" ")
=> ["Hello", "My", "name", "is", "Mary"]
#split后面没有参数,等同于str.split(" ")
irb(main):102:0> str.split
=> ["Hello", "My", "name", "is", "Mary"]
#split后面括号里面第2个参数,代表将str根据第一个参数分割,分割成长度为2的数组
irb(main):103:0> str.split(" ",2)
=> ["Hello", "My name is Mary"]
irb(main):104:0> str.split(" ",3)
=> ["Hello", "My", "name is Mary"]


(19)str.upto(str1) str到str1之间的数值,包括str和str1


系统会将str.upto(str1)储存为Enumerator(迭代器)对象,可以使用to_a将Enumerator对象转换成数组形式


irb(main):106:0> str_upto = "a".upto "f"
=> #<Enumerator: "a":upto("f")>
irb(main):107:0> str_upto.class
=> Enumerator
irb(main):108:0> str_upto.to_a
=> ["a", "b", "c", "d", "e", "f"]


“a”.upto(“f”)的功能和"a"…"f"是一样的


不过前者是Enumerator(迭代器)对象,后者是Range对象,也可以使用to_a将Range对象转换成数组形式


irb(main):109:0> str_range = "a".."f"
=> "a".."f"
irb(main):110:0> str_range.class
=> Range
irb(main):111:0> str_range.to_a
=> ["a", "b", "c", "d", "e", "f"]


(20)str.blank? 判断字符串是否为空或者nil?


blank?、empty?、nil?的区别:


nil? 判断对象是否为nil


empty?判断是否为空字段,空格不属于空字段


blank? 最常用,字符串为""、" "、nil均被判断为true,其他的为false,可认为是nil?和empty?的结合

irb(main):002:0> a = ""
=> ""
irb(main):003:0> a.nil?
=> false
irb(main):004:0> a.empty?
=> true
irb(main):005:0> a.blank?
=> true
irb(main):006:0> b = "  "
=> " "
irb(main):007:0> b.nil?
=> false
irb(main):008:0> b.empty?
=> false
irb(main):009:0> b.blank?
=> true


4、区间(Range)


区间分为两种:


一种是闭合区间(包含右边的值),就是上面讲的"a"…“f”


一种是半闭半开区间(不包括右边的值),比如"a"…“f”


irb(main):009:0> ("a".."f").to_a
=> ["a", "b", "c", "d", "e", "f"]
irb(main):010:0> ("a"..."f").to_a
=> ["a", "b", "c", "d", "e"]


区间经常会与块结合使用,后面我们讲块的时候会讲到。


目录
相关文章
|
2月前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
94 7
|
2月前
|
存储 Java 对象存储
String 属于基础的数据类型吗
String 在多数编程语言中被视为一种基础数据类型,但实际上它是由字符组成的序列。在一些语言中,如 Java 和 Python,String 被设计为不可变的对象,以简化编程和提高安全性。
44 5
|
5月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
5月前
|
前端开发 测试技术 数据库
使用Ruby on Rails进行快速Web开发的技术探索
【8月更文挑战第12天】Ruby on Rails以其高效、灵活和易于维护的特点,成为了快速Web开发领域的佼佼者。通过遵循Rails的约定和最佳实践,开发者可以更加专注于业务逻辑的实现,快速构建出高质量的Web应用。当然,正如任何技术框架一样,Rails也有其适用场景和局限性,开发者需要根据项目需求和个人偏好做出合适的选择。
|
5月前
|
存储 缓存 NoSQL
深入理解Redis数据类型String原理
本文深入探讨了Redis中String数据类型的实现原理和使用场景,基于Redis 5.0版本进行分析。
深入理解Redis数据类型String原理
|
5月前
|
前端开发 测试技术 API
揭秘Ruby on Rails的神秘力量:如何让你的Web应用飞起来?
【8月更文挑战第31天】Ruby on Rails(简称RoR)是一个基于Ruby语言的开源Web应用框架,自2005年发布以来,因简洁的语法、强大的功能和高效的开发效率而广受好评。RoR采用MVC架构,提高代码可读性和可维护性,拥有庞大的社区和丰富的库支持。本文通过示例代码展示其强大之处,并介绍RoR的核心概念与最佳实践,帮助开发者更高效地构建Web应用。
66 0
|
5月前
|
前端开发 API C++
在Ruby世界中寻找你的Web框架灵魂伴侣:Rails vs Sinatra
【8月更文挑战第31天】在Ruby的世界里,选择Web框架如同挑选衣物,需根据场合和需求。Rails与Sinatra是两大热门框架,前者以其“约定优于配置”理念和全面的功能成为企业级应用的首选;后者则以轻量级和灵活性著称,适用于快速原型开发和小规模应用。通过对比两者特性,如Rails的MVC架构与Sinatra的简洁API,我们可以看到它们各有所长。选择合适的框架,如同找到旅途中的最佳伙伴,让开发之路更加顺畅愉悦。这场探索之旅教会我们,没有绝对的好坏,只有最适合的选择。
52 0
|
5月前
|
安全 前端开发 数据安全/隐私保护
如何在Ruby on Rails中打造坚不可摧的OAuth认证机制
【8月更文挑战第31天】在构建现代Web应用时,认证与授权至关重要。本文介绍如何在Ruby on Rails中实现OAuth认证,通过使用`omniauth`和`devise` gems简化流程。首先安装并配置相关gem,接着在`User`模型中处理OAuth回调,最后设置路由及控制器完成登录流程。借助OAuth,用户可使用第三方服务安全地进行身份验证,提升应用安全性与用户体验。随着OAuth标准的演进,这一机制将在Rails项目中得到更广泛应用。
66 0
|
6月前
|
SQL 安全 数据库
Ruby on Rails 数据库迁移操作深度解析
【7月更文挑战第19天】Rails 的数据库迁移功能是一个强大的工具,它帮助开发者以版本控制的方式管理数据库结构的变更。通过遵循最佳实践,并合理利用 Rails 提供的迁移命令和方法,我们可以更加高效、安全地管理数据库结构,确保应用的稳定性和可扩展性。
|
6月前
|
缓存 NoSQL Redis
Redis深度解析:核心数据类型之string
Redis 数据类型包括String、Hash、List、Set和Sorted Set。对于String类型的主要操作, 此外,还有通用的Key操作。