while(i < bArray.length)
if(aArray.include?(bArray[i]) == false) then
return false
end
i+=1
end
我已经写了上面的内容,但我觉得它很丑陋。在一个声明中必须有一个简洁的方法来做到这一点..但是如何?
答案 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?))