while(i < bArray.length)
if(aArray.include?(bArray[i]) == false) then
return false
end
i+=1
end
我已經寫了上面的內容,但是我發現它很醜並且臃腫。在一個聲明中必須有一個清晰的方法來做到這一點..但如何?一次完成此操作?
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