只能打电话给.uniq!在一个不是uniq的数组上

时间:2014-07-23 19:55:37

标签: ruby

我对红宝石比较新,所以请耐心等待。我有一个名为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语法可以使它干净简单。

3 个答案:

答案 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)

避免在方法链中返回Nil的方法

如果没有进行任何更改,

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上调用缺少的方法。