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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章