一次性做到这一点?

时间:2010-12-04 01:51:05

标签: ruby

while(i < bArray.length)
  if(aArray.include?(bArray[i]) == false) then
    return false
  end
  i+=1
end

我已经写了上面的内容,但我觉得它很丑陋。在一个声明中必须有一个简洁的方法来做到这一点..但是如何?

3 个答案:

答案 0 :(得分:6)

这应该是等价的:

while i < bArray.length
  return false unless aArray.include?(bArray[i])

  i += 1
end

这是一个我认为应该相同的单行:

bArray.all? { |item| aArray.include?(item) }

答案 1 :(得分:5)

看起来你正试图找出aArray是否包含bArray的所有元素。

aArray = %w[a b c d]
bArray = %w[a b c z]

(bArray - aArray).empty? # => false

我仔细看了一下原始代码,它有一个逻辑炸弹滴答作响:

def cmp_array(aArray, bArray)
  i = 0
  while (i < bArray.length)
    if (aArray.include?(bArray[i]) == false) then
      return false
    end
    i += 1
  end
end

def cmp_array2(a, b)
  (b - a).empty?
end

cmp_array( %w[ a b c ], %w[ a b c   ]) # => nil
cmp_array( %w[ a b c ], %w[ c b a   ]) # => nil
cmp_array( %w[ a b c ], %w[ a b     ]) # => nil
cmp_array( %w[ a b c ], %w[ a b c d ]) # => false
cmp_array( %w[ a b   ], %w[ a b c   ]) # => false

cmp_array2( %w[ a b c ], %w[ a b c   ]) # => true
cmp_array2( %w[ a b c ], %w[ c b a   ]) # => true
cmp_array2( %w[ a b c ], %w[ a b     ]) # => true
cmp_array2( %w[ a b c ], %w[ a b c d ]) # => false
cmp_array2( %w[ a b   ], %w[ a b c   ]) # => false

我必须添加i = 0初始值设定项,否则Ruby会抱怨未初始化的变量。

请注意cmp_array返回nil或false,强制对nil?false?进行额外测试以执行有用的操作。

if (cmp_array( %w[ a b c ], %w[ a b c   ]).nil?) ...

或:

if (cmp_array( %w[ a b c ], %w[ a b c d ]).false?) ...

与之相比:

if (cmp_array2( %w[ a b c ], %w[ a b c   ])) ...

始终返回true / false。

答案 2 :(得分:4)

bArray.all?(&aArray.method(:include?))