我对红宝石比较新,所以请耐心等待。我有一个名为a
的数组。 a
是一个字符串数组,有时可以是唯一的,有时不是。所以a
可能如下所示:
#an example of a unique instance of a
a = ["a", "b", "c", "d"]
#an example of a non-unique instance of a
a = ["a", "a", "b", "a"]
我在做a.uniq!.map!
。仅当a
不唯一时才有效,因为如果数组已经是唯一的,则调用uniq
只会返回一个空数组,并且会在nil对象上调用.map!
错误。检查数组是否唯一以及是否在其上调用uniq
并且如果它不唯一的最红宝石方法是什么,我不会在其上调用uniq
。
我意识到我可以很容易地以冗长的方式做到这一点,但我觉得有一些ruby语法可以使它干净简单。
答案 0 :(得分:4)
map!
和uniq!
更改了调用它们的数组。如果nil
不更改数组,则返回值为uniq!
。
如果您始终希望操作返回数组,请使用uniq
。它仅返回一个具有唯一值的新数组:
#an example of a unique instance of a
a = ["a", "b", "c", "d"].uniq
# => ["a", "b", "c", "d"]
#an example of a non-unique instance of a
a = ["a", "a", "b", "a"].uniq
# => ["a", "b"]
答案 1 :(得分:0)
来自Ruby Doc
从self中删除重复的元素。
如果给出了一个块,它将使用块的返回值进行比较。
它使用hash和eql来比较值?提高效率的方法。
如果未进行任何更改(即没有找到重复项),则返回nil。
为什么不首先a.uniq!
然后a.map!
?
答案 2 :(得分:0)
Array#uniq!将返回nil,而Array#uniq将返回一个新数组,无论原始数组中是否有任何重复。
请考虑以下事项:
a = %w[a b c d]
a.uniq
# => ["a", "b", "c", "d"]
a.uniq.map!
# => #<Enumerator: ["a", "b", "c", "d"]:map!>
正如您所看到的,在这种情况下,避免方法链中间的爆炸方法将确保您不会在nil上调用缺少的方法。