ruby 中的处理数组函数与Hash

>>  "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!"

猜你喜欢

转载自wangsuting.iteye.com/blog/2003890