Ruby语言的知识点很多,不过对于Rails 开发者来说需要掌握的很少。本文主要内容来自于《ruby on rails tutoril》这本书,是对这本书学习后第四章的个人总结,内心非常感谢该书作者Michael Hartl,也非常感谢中文翻译安道老师🙏
字符串和方法
Rails控制台:Rails控制台是用来与Rails应用交互的命令行工具,它基于Ruby的交互程序(irb)开发,可以使用ruby语言的所有功能,本文的操作都是在Rails控制台中完成的。
字符串
对于web应用,字符串或许是最重要的数据结构,因为网页的内容就是从服务器发送给浏览器的字符串。(书中原话)
如图-1,使用双引号("")创建字符串;使用 + 拼接字符串;使用特殊句法 #{} 进行插值操作。
Ruby 也支持单引号创建字符串,大多数情况下这两种字符串效果是一样的,二者最重要的区别是:Ruby 不会对单引号字符串进行插值操作。
注释:Ruby中的注释以井号 # 开始,一直到行尾。
对象和消息传送
在Ruby中,一切皆对象,对象的作用:响应消息。一般来说,传给对象的消息是“方法”,也就是在这个对象上定义的函数。
>> "GongYangbo".length #字符串响应length方法,返回字符串中包含的字符数量
=> 10
empty? 方法后面的❓是ruby的约定 ,说明返回的是布尔值;
布尔值可以和 &&(与) ||(或) !(非) 运算符结合到一起使用;
>> nil.to_s #一切皆对象,nil也是对象,响应to_s方法
=> ""
>> puts "It's a palindrome!" if s == s.reverse #简单的回文测试
数组和值域
数组是一组具有特定顺序的元素。Ruby中可以包含不同类型的数据。
split 方法
>> "gong yang bo".split #把字符串拆分成有三个元素的数组
=> ["gong", "yang", "bo"]
默认情况下,split在空格处把字符串拆分成数组,不过也可以在几乎任何地方拆分:
>> "fooxbarxbazx".split('x')
=> ["foo", "bar", "baz"]
数组可以响应一系列方法:
>> a
=> [42, 8, 17]
>> a.length #数组中元素个数
=> 3
>> a.empty? #数组是否为空
=> false
>> a.include?(42)#数组元素中是否包含42
=> true
>> a.sort #排序
=> [8, 17, 42]
>> a.reverse #元素对掉
=> [17, 8, 42]
>> a.shuffle #打乱元素顺序,随机变化
=> [17, 42, 8]
>> a
=> [42, 8, 17]
上面的方法都没有修改 a 的值。如果要修改数组的值,要使用相应的“炸弹”(bang)方法(之所以这么叫是因为,这里的感叹号经常都读作“bang”):
>> a
=> [42, 8, 17]
>> a.sort!
=> [8, 17, 42]
>> a
=> [8, 17, 42]
使用push方法向数组中添加元素,或者使用等价的<<运算符:
>> a.push(6) # 把 6 加到数组末尾
=> [42, 8, 17, 6]
>> a << 7 # 把 7 加到数组末尾
=> [42, 8, 17, 6, 7]
>> a << "foo" << "bar" # 串联操作
=> [42, 8, 17, 6, 7, "foo", "bar"]
join 方法:split方法可以把字符串拆分成数组,使用join方法可以把数组转化成字符串(相反的操作)(图-2)
值域(range)
Range是范围对象的类,定义的时候可以使用范围操作符“..”或者“...”,“..”生成的范围对象包括起点和终点,“...”生成的范围对象不包括起点和终点,范围是由是一序列有顺序、有规律的元素对象组成,任何有顺序,有规律的一组对象,都可以用Range对象来定义,如数字、字母、字符串、甚至时间。
#遍历2017-01-01至2017-02-28每一天,对象是Date
begin_date = Date.parse '2017-01-01'
end_date = Date.parse '2017-02-28'
r1=begin_date .. end_date
r1.each{|date| puts date}
块(block)
数组和值域可以响应的方法中有很多都可以跟着一个块(block)
>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5
这段代码在值域(1..5)上调用each方法,然后又把{ |i| puts 2 * i }这个块传给each方法。|i|两边的竖线在 Ruby 中用来定义块变量。只有方法本身才知道如何处理后面跟着的块。这里,值域的each方法会处理后面的块,块中有一个局部变量i,each会把值域中的各个值传进块中,然后执行其中的代码。
花括号是表示块的一种方式,除此之外还有另一种方式:
>> (1..5).each do |i|
>> puts 2 * i
>> end
2
4
6
8
10
=> 1..5
inject 方法
arr1 = []
arr2 = [1,2,3]
arr2.each do |i|
arr1 << i + 1
end
p arr1
#=> [2, 3, 4]
使用inject:
arr = arr2.inject ([]) do |arr1, i|
arr1 << i + 1
end
p arr
#=>[2,3,4]
map 方法
>> (1..5).map { |i| i**2 } # ** 表示幂运算
=> [1, 4, 9, 16, 25]
>> %w[a b c] # %w 用于创建元素为字符串的数组
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
map方法返回的是在数组或值域中每个元素上执行块中代码后得到的结果。
map后面的块在块变量上调用一个方法,这种操作经常使用简写形式:
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]
生成随机8个字母组合:
>> ('a'..'z').to_a # 由全部英文字母组成的数组
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
>> ('a'..'z').to_a.shuffle # 打乱数组
=> ["c", "g", "l", "k", "h", "z", "s", "i", "n", "d", "y", "u", "t", "j", "q",
"b", "r", "o", "f", "e", "w", "v", "m", "a", "x", "p"]
>> ('a'..'z').to_a.shuffle[0..7] # 取出前 8 个元素
=> ["f", "w", "i", "a", "h", "p", "c", "x"]
>> ('a'..'z').to_a.shuffle[0..7].join # 把取出的元素合并成字符串
=> "mznpybuj"