红宝石 - uniq之间有什么区别!和uniq

Yon*_*Noh 2 ruby ruby-on-rails

a = [1,2,3]
a.uniq!  # nil
a.uniq  # [1,2,3]
Run Code Online (Sandbox Code Playgroud)

为什么a.uniq!不是[1,2,3]?

让我知道原因.谢谢!

cod*_*ade 7

您需要阅读Ruby文档.

uniq方法通过删除self中的重复值来返回一个新数组.如果未找到重复项,则返回相同的数组值.

a = [ "a", "a", "b", "b", "c" ]
a.uniq  # => ["a", "b", "c"]

b = [ "a", "b", "c" ]
b.uniq  # => ["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)

uniq!方法从self中删除重复元素,nil如果未进行任何更改则返回(即,未找到重复项).

a = [ "a", "a", "b", "b", "c" ]
a.uniq!   # => ["a", "b", "c"]

b = [ "a", "b", "c" ]
b.uniq!   # => nil
Run Code Online (Sandbox Code Playgroud)


bos*_*vic 6

大多数以 bang (!) 结尾的方法都会更改变量,而没有它的方法只会返回更改后的变量。

所以,如果你有这样的事情:

a = [1, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

a.uniq会返回[1, 2, 3],但不会改变a,而a!会改变a等于[1, 2, 3]

[1] pry(main)> a = [1,1,2,3]
=> [1, 1, 2, 3]
[2] pry(main)> a.uniq
=> [1, 2, 3]
[3] pry(main)> a
=> [1, 1, 2, 3]
[4] pry(main)> a.uniq!
=> [1, 2, 3]
[5] pry(main)> a
=> [1, 2, 3]
[6] pry(main)> a.uniq!
=> nil
[7] pry(main)> a
=> [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,虽然正如@bosskovic 所说,在 ruby​​ 中使用 bang 来表示“危险”方法,但您不能总是安全地假设是这种情况。例如,许多活动记录方法(例如 .save! 和 .create!)使用 bang 来表示如果失败而不是返回 false,它们将引发异常。在逐个方法的基础上查找它们是最安全的,因为没有强制执行这些约定中的任何一个。 (3认同)