Ruby 使用。包括?防止重复

Ruby 使用。包括?防止重复,ruby,Ruby,对于如何使用.include?来防止重复项目加入列表,我有点困惑 def add_item!(item, list) list << item end 我首先被告知在列表中添加一项 def add_item!(item, list) list << item end 您可以这样使用它: def add_item!(item, list) list << item unless list.include?(item) end def添加项目!(

对于如何使用
.include?
来防止重复项目加入列表,我有点困惑

def add_item!(item, list)
  list << item
end
我首先被告知在列表中添加一项

def add_item!(item, list)
  list << item
end

您可以这样使用它:

def add_item!(item, list)
  list << item unless list.include?(item)
end
def添加项目!(项目、清单)

listIr您只想维护数组,不知道是否添加了元素,您可以这样做

def add_item!(item, list)
  list = list | [item]
end
在这里你可以找到一个例子

2.2.1 :001 > [1,2]
 => [1, 2] 
2.2.1 :002 > [1,2] | [1]
 => [1, 2] 
2.2.1 :003 > [1,2] | [1,3]
 => [1, 2, 3] 
2.2.1 :004 > 
ary |其他| ary→ 新德里

Set Union-通过将ary与其他ary合并,排除>任何重复项并保留原始数组的顺序,返回一个新数组

但是如果您想知道元素是否被拒绝,您可以这样做

def add_item!(item, list)
  list << item unless list.include?(item)
end
def添加项目!(项目、清单)

list如果你想把代码放在一个方法中,你必须考虑到Ruby是通过值传递参数的,而不是通过引用。我不知道为什么在第一种情况下,这似乎有效,这本身就是一个问题。因此,我以第一个方法的名称结尾!(在适当的地方)但不是另外两个

我用三种不同的方法做了一些基准测试,包括?解决方案显然获胜。放置数组的初始值需要时间,但是所有的解决方案都必须这样做,这样您就可以放弃它

require 'set'
require 'benchmark'

def add_item1!(item, list)
  list << item unless list.include?(item)
end

def add_item2(item, list)
  list |= [item]
end

def add_item3(item, list)
  set = Set.new(list)
  set << item
  list = set.to_a
end

array1 = [3,2,1,4]
add_item1!(2, array1) # [3, 2, 1, 4]
add_item1!(5, array1) # [3, 2, 1, 4, 5]

array2 = [3,2,1,4]
array2 = add_item2(2, array2) # [3, 2, 1, 4]
array2 = add_item2(5, array2) # [3, 2, 1, 4, 5]

array3 = [3,2,1,4]
array3 = add_item3(2, array3) # [3, 2, 1, 4]
array3 = add_item3(5, array3) # [3, 2, 1, 4, 5]

TESTS = 100000
Benchmark.bmbm do |results|
  results.report("unless not new") {TESTS.times {array1 = [3,2,1,4];add_item1!(2, array1) }}
  results.report("unless new")     {TESTS.times{array1 = [3,2,1,4];add_item1!(5, array1) }}
  results.report("|= not new")     {TESTS.times{array2 = [3,2,1,4];array2 = add_item2(2, array2) }}
  results.report("|= new")         {TESTS.times{array2 = [3,2,1,4];array2 = add_item2(5, array2) }}
  results.report("Set not new")    {TESTS.times{array3 = [3,2,1,4];array3 = add_item3(2, array3) }}
  results.report("Set new")        {TESTS.times{array3 = [3,2,1,4];array3 = add_item3(5, array3) }}
end

#                      user     system      total        real
# unless not new   0.031000   0.000000   0.031000 (  0.027002)
# unless new       0.047000   0.000000   0.047000 (  0.052003)
# |= not new       0.125000   0.000000   0.125000 (  0.118007)
# |= new           0.125000   0.000000   0.125000 (  0.126007)
# Set not new      0.358000   0.000000   0.358000 (  0.354020)
# Set new          0.359000   0.000000   0.359000 (  0.364021)
require'set'
需要“基准”
def添加_项1!(项目、清单)

列出你的问题是什么?使用集合而不是数组@NullSoulException set不能保证数组的有序性,这样的方法也应该有效=>>list |=[item]我完全忘记了
,除非
。但是,它返回
nil
,而不是说
orange
,作为一个项目。然后,当项目包括在内时,您可以使用if/else语句来执行一些特殊操作。请不要在询问问题后添加要求。我提供的代码可以防止重复请求。我只是不知道如何使用
,除非
使其返回
nil
。我无意添加一个“要求”。关于接受rSV,我问了一个关于通过引用传递的问题,答案很好,但应该注意,如果你在列表中添加了几个项目,你会得到不同的结果。特别是,创建一个集合的设置成本很快就会产生回报。另一种可能是,根据应用程序的不同,随意添加,然后
uniq
ifying。