2017-09-26 44 views
1

使用HackerRank刷了我的能力,看到這段代碼:即使它們沒有被使用,你是否應該傳入塊變量?

> h = {1 => 1, 2 => 4, 3 => 9, 4 => 16, 5 => 25} 
=> {1 => 1, 2 => 4, 3 => 9, 4 => 16, 5 => 25} 
> h.keep_if {|key, value| key % 2 == 0} 

我看到的是,即使沒有使用value塊變量,它仍然在過去,我知道,它的作品無論是方式(帶或不帶value),但是傳遞你不打算使用的變量是否更正確?或者傳遞即使不被使用的變量也應該被傳入,因爲它被認爲是更好的「形式」。

回答

5

這可能是個倔強的意見,但是我工作的項目中的規則是通過它,但只作爲_value_,因爲它在塊的定義中進行通信,表明該變量未被遺忘但不會被使用。

所以,在你的榜樣,這將意味着

h.keep_if {|key, _| key % 2 == 0} 

我們通常通過rubocop使用RuboCop::Cop::Lint::UnusedMethodArgument

,當一個方法被重寫相同的規則應用和壓倒一切的實現不使用的強制執行可變的,但需要列出它以匹配原始簽名。

+0

也許值得注意的是'_'和'_a'是有效的局部變量。例如,可以編寫'[1,2,3] .map {| _ | 2 * _}#=> [2,4,6]'。名稱以下劃線開頭的塊變量在一個方面是特殊的,但是:[[1,2,3],[3,4,5]]。map {| _y,x,_y | x}#=> [2,4]',而'[[1,2,3],[3,4,5]] map {| y,x,y | x}#=> SyntaxError:(irb):569:重複的參數名稱。 –

-1

我在IRB中測試出來後意識到這是必須在某些方法中通過value變量來使它們工作。

hash = {1=>3, 4=>7, 3=>2, 5=>6} 
hash.find{|k|k.odd?} #without value block variable will return an error 
hash.find{|k,v|k.odd?} #returns [1,3] 
+1

'hash.find {| k |放置「k =#{k}」; k.odd?}#=> k = [1,3] NoMethodError:未定義方法'odd?'對於[1,3]:Array'。傳遞給塊的第一個值是'hash.find.next#=> [1,3]然後將塊變量'k'設置爲等於該數組。順便說一句,這不是一個答案,所以你應該刪除它。但是,您可以將其添加到您的問題中。 –

相關問題