>> "foo bar baz".split # 把字符串分割成有三个元素的数组 => ["foo", "bar", "baz"]
默认情况下,split 在空格处把字符串分割成数组,可带参数:
>> "fooxbarxbazx".split('x') => ["foo", "bar", "baz"]
>> a = [42, 8, 17] >> a.first => 42 >> a.second => 8 >> a.last => 17 >> a.last == a[-1] => 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 方法可以向数组中添加元素,或者使用等价的 << 操作符,Ruby 不像很多其他的语言,数组可以包含不同类型的数据:
>> 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"]
前面我们用 split 把字符串分割成字符串,我们还可以使用 join 方法进行相反的操作:
>> a => [42, 8, 17, 7, "foo", "bar"] >> a.join # 没有连接符 => "428177foobar" >> a.join(', ') # 连接符是一个逗号和空格 => "42, 8, 17, 7, foo, bar"
和数组有点类似的是 Range,使用 to_a 方法把它转换成数组或许更好理解:
>> 0..9 => 0..9 >> 0..9.to_a # 错了,to_a 在 9 上调用了 NoMethodError: undefined method `to_a\' for 9:Fixnum >> (0..9).to_a # 调用 to_a 要用括号包住 Range => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Range 经常被用来获取一组数组元素:
>> a = %w[foo bar baz quux] #%w 创建一个元素为字符串的数组 => ["foo", "bar", "baz", "quux"] >> a[0..2] => ["foo", "bar", "baz"]
Range 也可使用字母:
>> ('a'..'e').to_a => ["a", "b", "c", "d", "e"]
map方法,map 方法返回的是在数组或 Range 的每个元素上执行块中代码后的结果。
3.times { puts "Betelgeuse!" } # 3.times 后跟的块没有变量 "Betelgeuse!" "Betelgeuse!" "Betelgeuse!" => 3 >> (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"]
Hash 通过一对花括号中包含一些键值对的形式表示,Hash 的元素没有特定的顺序。8 如果顺序很重要的话就要使用数组了。
目前为止我们的键用的都是字符串,但在 Rails 中用 Symbol 当键却很常见。Symbol 看起来像字符串,只不过没有包含在一对引号中,而是在前面加一个冒号。例如,:name 就是一个 Symbol。可以把 Symbol 看成没有约束的字符串:
>> "name".split('') => ["n", "a", "m", "e"] >> :name.split('') NoMethodError: undefined method `split' for :name:Symbol >> "foobar".reverse => "raboof" >> :foobar.reverse NoMethodError: undefined method `reverse' for :foobar:Symbol
Symbol当键的两种形式
{ :name => "Michael Hartl", :email => "[email protected]" } { name: "Michael Hartl", email: "[email protected]" }
inspect 方法,因为使用 inspect 输出对象的方式经常使用,为此还有一个专门的快捷方式,p 方法:
>> puts (1..5).to_a # 把数组作为字符串输出 1 2 3 4 5 >> puts (1..5).to_a.inspect # 输出一个数组字面量形式 [1, 2, 3, 4, 5] >> puts :name, :name.inspect name :name >> puts "It worked!", "It worked!".inspect It worked! "It worked!"