【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 开发者 Python
Python中,字符串(String)是一种不可变的数据类型
Python中,字符串(String)是一种不可变的数据类型
13 5
|
20天前
|
JavaScript 前端开发 索引
JavaScript有7个数据类型:Number, String, Boolean, Null, Undefined, Symbol(BES6)和BigInt(ES10)组成基本类型
【6月更文挑战第25天】JavaScript有7个数据类型:Number, String, Boolean, Null, Undefined, Symbol(BES6)和BigInt(ES10)组成基本类型,而Object包括Array、Function等是引用类型。Objects可以包含键值对,Array是特殊的Object。Functions也是对象。`null`和`undefined`被视为特殊的原始值。
17 1
|
1月前
|
前端开发 测试技术 数据库
Ruby on Rails:快速开发Web应用的秘密
【6月更文挑战第9天】Ruby on Rails,一款基于Ruby的Web开发框架,以其高效、简洁和强大备受青睐。通过“约定优于配置”减少配置工作,内置丰富功能库加速开发,如路由、数据库访问。活跃的社区和海量资源提供支持,MVC架构与RESTful设计确保代码清晰可扩展。高效的数据库迁移和测试工具保证质量。Rails是快速构建Web应用的理想选择,未来将持续影响Web开发领域。
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
TS,数据类型概述,常见的基本数据类型有number/string/boolean/undefined/null,字符串用““,let food: string = ‘糖葫芦‘,布尔类型
|
25天前
|
索引
String index out of range错误与解决方法
String index out of range错误与解决方法
|
2月前
|
开发框架 安全 前端开发
使用Ruby on Rails进行快速Web开发
【5月更文挑战第27天】Ruby on Rails是一款基于Ruby的高效Web开发框架,以其快速开发、简洁优雅和强大的社区支持著称。遵循“约定优于配置”,Rails简化了开发流程,通过MVC架构保持代码清晰。安装Ruby和Rails后,可使用命令行工具创建项目、定义模型、控制器和视图,配置路由,并运行测试。借助Gem扩展功能,优化性能和确保安全性,Rails是快速构建高质量Web应用的理想选择。
|
2月前
|
Java API
【JAVA学习之路 | 提高篇】包装类(包装类与基本数据类型及String类之间的转换)
【JAVA学习之路 | 提高篇】包装类(包装类与基本数据类型及String类之间的转换)
|
2月前
|
监控 数据可视化 前端开发
使用Ruby on Rails构建的员工上网行为监控Web应用
我们开发了一款基于Ruby on Rails的员工上网行为监控Web应用,帮助企业保护数据安全和确保员工生产力。该应用利用Rails的MVC架构和Active Record管理数据库,通过网络代理和JavaScript追踪员工网络活动。数据收集后,应用进行分析和可视化,以便识别异常行为。此外,借助Rails的后台任务和Sidekiq gem,实现数据自动化处理和定时更新,为公司提供实时监控反馈。
284 2
|
2月前
|
缓存 前端开发 测试技术
框架分析(6)-Ruby on Rails
框架分析(6)-Ruby on Rails
|
2月前
|
XML 编解码 数据格式
Python标准数据类型-String(字符串)
Python标准数据类型-String(字符串)
32 2