一次完成此操作?

问题描述:

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

我已经写了上面的内容,但是我发现它很丑并且臃肿。在一个声明中必须有一个清晰的方法来做到这一点..但如何?一次完成此操作?

+1

为了清晰和一致,也许还要写出英文的预期行为。这应该有助于“搭配”下面的替代方法。例如,`i`的确切最终结果(似乎只是一个临时变量)可能很重要。或者它可能不会。另外,输入可能会提前发生分歧(如果有的话)。或者它可能不会。增加的细节(例如不是“这样做”)也可以提升为问题标题以创建更好的帖子。 – 2010-12-04 02:51:51

+0

在Ruby中,通常使用`snake_case`而不是`camelCase`。 – 2010-12-05 22:27:47

这应该是等价的:

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 ])) ... 

一贯地返回真/假。