ruby - uniq 有啥区别!和 uniq [重复]

Posted

技术标签:

【中文标题】ruby - uniq 有啥区别!和 uniq [重复]【英文标题】:ruby - what is the difference between uniq! and uniq [duplicate]ruby - uniq 有什么区别!和 uniq [重复] 【发布时间】:2016-02-28 15:43:37 【问题描述】:
a = [1,2,3]
a.uniq!  # nil
a.uniq  # [1,2,3]

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

告诉我原因。谢谢!

【问题讨论】:

http://ruby-doc.org/core-2.2.0/Array.html 欢迎来到 Stack Overflow。请不要使用 Stack Overflow 作为阅读文档和进行研究的替代品。请阅读“How to Ask”和meta.***.com/questions/261592/… 【参考方案1】:

您需要阅读Ruby 文档。

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

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

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

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

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

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

【讨论】:

第一个不是“uniq”吗? 这个答案解释了nil。 +1。【参考方案2】:

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

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

a = [1, 1, 2, 3]

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]

【讨论】:

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

以上是关于ruby - uniq 有啥区别!和 uniq [重复]的主要内容,如果未能解决你的问题,请参考以下文章

linux shell 去重 uniq和sort的区别

shell中uniq与sort -u 两种去重的对别

22.Shell特殊符号和cut,sort,wc,uniq,tee,tr,split命令

uniq和tee命令

uniq

sort和uniq命令