2017-12-05 8 views
1

coding puzzleを解決しようとしていました。文字列を取り、繰り返し単語を含まないものを数えます。"do"を使用するとRubyブロックが予期せず動作する

このコードは動作します:

def validate(passphrase) 
    words = passphrase.split 
    words == words.uniq 
end 

passphrases = File.readlines("../input/passphrases.txt") 

p passphrases.count {|phrase| validate(phrase)} 
#=> 337 

私はカウントブロックと1つのマイナーな変更を行う場合は、パスフレーズの代わりに、ブロックを通過したときにtrueを返しますものだけをすべてカウントします。

p passphrases.count do |phrase| 
    validate(phrase) 
end 
#=>512 

これは何ですか?

+1

@sawaを、あなたが参照する質問が尋ねるかどうか 'DO ... end'または' {... } 'は、この質問とは異なる一般的に使用されるべきですが、参照されている質問に対する選択された回答は確かにこの質問に対する答えです。それはこれを以前の質問のダンプにしていますか?面白い。 –

答えて

3

これは、doブロックの引数の優先順位によるものです。 dop関数に適用されている

p(passphrases.count) do |phrase| 
    validate(phrase) 
end 

doブロックと第二つに相当する

p(passphrases.count {|phrase| validate(phrase)})

あなたの最初の例では、と等価です。あなたは後者の場合は、最初に一致する括弧内にブロック全体をラップする場合

は:

p(passphrases.count do |phrase| 
    validate(phrase) 
end) 
+0

だから、ブロックを持つpを呼び出してもエラーは出ないし、何もしないように見えるのはなぜですか? –

+0

@FluffyRibbitなぜそれはエラーを投げるでしょうか?任意のメソッドをブロックで呼び出すことができます。必要な場合はブロックを使用する方法に従います。残念ながら、メソッドがブロックを必要としたり、ブロックを必要としないと言ったりする方法はありません。 –

+1

@muistooshort 'raise 'を使ってメソッドがそれを言うことはできません" block_given?および 'raise"を除いてブロックを必要とします "block_givenなら'? –

関連する問題