2011-07-16 4 views
3

最近Rubyの学習を始めました。しかし、私はちょうど私が理解していない事件を発見した:それぞれに渡されたコードブロックは角括弧で処理されますが、 'do' - 'end'(ruby)では使用できません

#my_hash is a hash in which the keys are strings and the values arrays, but dont think about the specifics fo the code 

#if I run my code like this, it works perfectly 

my_hash.each do |art| 
    puts mystring.gsub(art[0]).each { 
    art[1][rand(art[1].length) -1] 
    } 
end 

#but if I use this, it prints "Enumerator" 

my_hash.each do |art| 
    puts mystring.gsub(art[0]).each do 
    art[1][rand(art[1].length) -1] 
    end 
end 

それはあなたが巣の終わりの対エンドペアはありますか? 私はここで

+0

答えはありませんが、あなたはハッシュイテレータを '| k、v |'形式で単純化することができます。 –

+0

これは[Ruby Block Syntax Error](http://StackOverflow.Com/q/6854283/)、[ブロック定義 - 中括弧と 'do'-' end'の違いは何ですか?](http:// StackOverflow '' do'ブロックと '' {'} ''を使用して、' 'do''を実行していないRubyマルチラインブロック(http://StackOverflow.Com/q/3680097/) http://StackOverflow.Com/q/2122380/)、[Rubyでこれらのブロックコーディングスタイルの違いや価値は何ですか?](http://StackOverflow.Com/q/533008/)、[Rubyブロックと括弧をはずさない引数](http://StackOverflow.Com/q/420147/)。 –

答えて

7
puts mystring.gsub(art[0]).each do 
    art[1][rand(art[1].length) -1] 
end 

1.9を使用していますが、括弧なしでputsと呼ばれ、do ... endは(とはEnumeratorで)ブロックして印刷mystring.gsub(art[0]).eachと何もしないputs方法を指します。

{ ... }は、最も近い方法で呼び出されます。醜いになりますが、あなたはdo ... endでそれを行うことができます。

puts(mystring.gsub(art[0]).each do 
    art[1][rand(art[1].length) -1] 
end) 

または、より良い、結果を変数に入れて、変数を印刷:

とにかく
var = mystring.gsub(art[0]).each do 
    art[1][rand(art[1].length) -1] 
end 
puts var 

eachは、オブジェクトを変更しないでくださいそれはオブジェクト自体を反復して返します。 mapメソッドが必要な場合は、テストしてください。

+0

ありがとう、非常に助けてください。私の場合は、オブジェクトを.eachに変更することができますが、gsubでそれを使用しているからです。 –

2

ネスティングのdo/endのペアはRubyでは完全に合法ですが、あなたは{}とdo/endの間の微妙な優先順位の問題に対処しています。

もう少し読むことができますhere。スコットの返信に拡大

+0

リンクはもう動作しません。 –

3

、およびJim Weirichを引用:演算子の優先順位表では、彼らが落ちるところ

違いがあります。 {}はdo/endよりも厳密にバインドします。例えば:

F G {}

は括弧は、メソッドgに属するF(G {})として解析されます。一方、

はF Gエンド

を行うF(g)は括弧メソッドfに属するエンドを行うように解析されます。括弧を省略してあいまいさを作成する場合にのみ重要です。

関連する問題