Ruby和uniq方法

jri*_*iff 2 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] 
Run Code Online (Sandbox Code Playgroud)

我不明白为什么实际上要修改a。我猜想括号会使uniq方法适用于括号中的所有内容,而不是变量。有人可以解释吗?

ton*_*edz 5

根据文档

a << 1
Run Code Online (Sandbox Code Playgroud)

返回a本身。

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

首先1将其压入数组,aa从中返回(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]
Run Code Online (Sandbox Code Playgroud)

请注意,该方法的名称末尾带有感叹号(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]
Run Code Online (Sandbox Code Playgroud)