2010-12-04 96 views
0
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

回答

6

這應該是等價的:

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

    i += 1 
end 

這裏是一個一行,我認爲應該是等價的:

bArray.all? { |item| aArray.include?(item) } 
4
bArray.all?(&aArray.method(:include?)) 
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初始化,否則紅寶石抱怨未初始化的變量。

請注意,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 ])) ... 

一貫地返回真/假。

相關問題