Ruby和uniq方法

时间:2014-11-28 20:36:04

标签: ruby arrays

我不明白:

2.0.0-p598 :003 > a=[1,2,3]
 => [1, 2, 3] 
2.0.0-p598 :004 > (a << 1).uniq!
 => [1, 2, 3] 
2.0.0-p598 :005 > a
 => [1, 2, 3] 

我不明白为什么实际修改了。我猜想括号会使uniq方法对括号中的所有内容起作用,而不是变量。有人可以解释一下吗?

1 个答案:

答案 0 :(得分:4)

根据documentation

a << 1

返回a本身。

您的代码会修改数组两次。

首先将1推送到数组a,然后从a返回(a << 1)。然后你打电话给uniq!

这里是代码一步一步地执行的操作,没有链接:

irb(main):001:0> a = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> a << 1
=> [1, 2, 3, 1]
irb(main):003:0> a
=> [1, 2, 3, 1]
irb(main):004:0> a.uniq!
=> [1, 2, 3]
irb(main):005:0> a
=> [1, 2, 3]

请注意,该方法的名称末尾有一个感叹号(bang!)。这是Ruby中用于修改它们所要调用的对象的方法的命名约定。您可以使用uniq代替uniq!,并且a数组未经修改。

irb(main):001:0> a = [1, 2, 3]
=> [1, 2, 3]
irb(main):002:0> a << 1
=> [1, 2, 3, 1]
irb(main):003:0> a
=> [1, 2, 3, 1]
irb(main):004:0> a.uniq
=> [1, 2, 3]
irb(main):005:0> a
=> [1, 2, 3, 1]