2016-12-29 9 views
10

とループ誤差Rubyで次の作品が、この1つはルビーIRB</p> <pre><code>for fruit in ['apple', 'banana', 'cherry', 'date'] do puts fruit end </code></pre> <p>言語で{}ブロックの区切り

# error 
for fruit in ['apple', 'banana', 'cherry', 'date'] { puts fruit } 

は、参考のため、以下のブロック区切りに注意してくださいしないでくださいエラーではありません

5.times do |i| 
    puts "hello "+i.to_s 
end 

5.times { |i| puts "hello "+i.to_s } 

編集:私が観察していることは、端がどのように矛盾しているかと思います私のミスを指摘してください。

+0

はなぜ知らないが、 'だけでなく do'を絞り込むにおける同様の制限があります。 –

+0

それはどんな慰めだ場合は、 'for'ループに開口部' do'を必要としません。 –

+0

これは、 'for'と' while'( 'for'のような役割を果たしているが)メソッドではないという事実に関係するかもしれません。しかし、私は正式な推論を待っています。 –

答えて

10

thisポストから次の引用は、「矛盾」も(強調鉱山を)説明:

endは、コンテキスト(条件文、クラスやモジュールの定義、メソッド定義、ループや例外を終了し、一般的なキーワードであります-catching [ステートメント])。 中括弧はブロックまたはハッシュを定義するための特殊な構文です。ブロック引数を指定していない方法 - - それゆえ、彼らはendキーワードで閉じる必要があり

forループは、制御構造です。例えばEnumerable#timesEnumerable#eachような方法は{ }又はdo ... end構文のいずれかで定義することができるブロックの引数を有します。

+0

すばらしい答え!ありがとう。以下のための... in' – PrimeLens

0

forは、ObjectまたはKernelで定義された方法ではなく、ブロックが必要ではありません。

あなたは書くことはできません。

class A { 
    def method { 
    } 
} 

のいずれか。カスタムmy_forメソッド定義することができ

module Kernel 
    def my_for(elements, &block) 
    elements.each(&block) 
    end 
end 

my_for ['apple','banana','cherry', 'date'] do |fruit| 
    puts fruit 
end 

my_for ['apple','banana','cherry', 'date'] { |fruit| puts fruit } 
+1

は 'Rubyで有効な制御式で、[ドキュメント](http://ruby-doc.org/core-2.4.0/doc/syntax/control_expressions_rdoc.html#label-for+を参照してくださいループ)。 – cobaltsoda

関連する問題