2016-08-10 8 views
0

私は(非常に)Rubyを初めて使っています。私は関数を呼び出す興味深い方法を見つけましたが、実際にどのように機能するかは分かりません。Ruby関数呼び出し:foo "bar" do

def foo (arg1) 
    puts arg1 
end 

foo "bar" do 
    "hello" 
    puts "world" 
    thisStuff 
end 

ここで何が起こっているのですか? "thisStuff"という関数はありませんが、コードは問題なくコンパイルされ、コンソールの結果は "bar"になります。

+4

'do' ...' end'は本質的に無名関数で、 'foo'に渡される*ブロック*です。これは、 'yield'を使って' foo'関数内で実行できますが、ブロックが決して実行されないように 'yield'は呼び出されません。 –

+0

ありがとう、それは私が探していたものです。あなたのコメントを公式の答えにすることができますか?私はそれを解決策として設定し、この質問を閉じることができますか? – everyonecancode

+0

あなたの質問は不明です。 Rubyには機能がありません。あなたが投稿したコードスニペットには少なくとも3つの異なるものがありますが、それらはRubyでそう呼ばれることはありませんが、 "関数"と呼ばれるかもしれません。どちらがあなたについて話しているのですか? –

答えて

2

do ... endfooに渡さブロック、基本的に匿名関数、です。ブロックyieldを使用してfoo関数内で実行できますが、yieldは呼び出されないのでブロックは実行されません。

{}という構文を使用して宣言されたこれらのブロックは、do ... endという同じ意味です。それらはほとんどmapまたはselectのような関数型プログラミング関数で使用されます。

2

ルビーブロックは、あなたが入れたコードですdo - endキーワード!

ブロックにはがあり、コードを実行するにはという結果が得られます。この(:http://mixandgo.com/blog/mastering-ruby-blocks-in-less-than-5-minutesソース):見てみましょう

enter image description here

あなたのケースではそれだけで歩留まりを追加block.Tryで一部を実行する呼び出されたときに、あなたのブロックfooが故にyieldを持っていませんでしたとなり、期待どおりの例外が発生します。

Rubyの強力なツールの1つであるため、上記のリンクをチェックしてさらにブロックを探索してください。

+0

ありがとう(特にリンクの場合)、OrangeFlash81が私の質問に最初に答えました。したがって、私は彼に "答え"のステータスを与えましたが、これはもっと肉があります:)。 – everyonecancode

+0

@everyonecancode問題なく仲間:)、喜んで助けてください – Nimir

関連する問題