一次完成此操作?
问题描述:
while(i < bArray.length)
if(aArray.include?(bArray[i]) == false) then
return false
end
i+=1
end
我已经写了上面的内容,但是我发现它很丑并且臃肿。在一个声明中必须有一个清晰的方法来做到这一点..但如何?一次完成此操作?
答
这应该是等价的:
while i < bArray.length
return false unless aArray.include?(bArray[i])
i += 1
end
这里是一个一行,我认为应该是等价的:
bArray.all? { |item| aArray.include?(item) }
答
bArray.all?(&aArray.method(:include?))
答
它看起来像你想,如果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
初始化,否则红宝石抱怨未初始化的变量。
请注意,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 ])) ...
一贯地返回真/假。
为了清晰和一致,也许还要写出英文的预期行为。这应该有助于“搭配”下面的替代方法。例如,`i`的确切最终结果(似乎只是一个临时变量)可能很重要。或者它可能不会。另外,输入可能会提前发生分歧(如果有的话)。或者它可能不会。增加的细节(例如不是“这样做”)也可以提升为问题标题以创建更好的帖子。 – 2010-12-04 02:51:51
在Ruby中,通常使用`snake_case`而不是`camelCase`。 – 2010-12-05 22:27:47