Rubyのパイプシンボルは何ですか?
私はRubyとRoR、PHPとJavaバックグラウンドから来ていますが、この:
def new
@post = Post.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @post }
end
end
|format|
パートは何をしていますか? PHP/Javaのこれらのパイプシンボルの同等の構文は何ですか?
それらは、ブロックに渡される変数です。
def this_method_takes_a_block
yield(5)
end
this_method_takes_a_block do |num|
puts num
end
「5」を出力します。より難解な例:
def this_silly_method_too(num)
yield(num + 5)
end
this_silly_method_too(3) do |wtf|
puts wtf + 1
end
出力は「9」です。
これも最初は非常に奇妙でしたが、この説明/ウォークスルーがお役に立てば幸いです。
ドキュメンテーション 主題に触れる 、非常に良い方法で-私の答えが役に立たない場合、私は彼らのガイドが確信しています。
最初に、シェルでirb
と入力してヒットすることにより、インタラクティブRubyインタープリターを起動します Enter。
次のように入力します。
the_numbers = ['ett','tva','tre','fyra','fem'] # congratulations! You now know how to count to five in Swedish.
ちょうど私たちが遊ぶ配列を持っているように。次に、ループを作成します。
the_numbers.each do |linustorvalds|
puts linustorvalds
end
改行で区切られたすべての数値を出力します。
他の言語では、次のようなものを書く必要があります。
for (i = 0; i < the_numbers.length; i++) {
linustorvalds = the_numbers[i]
print linustorvalds;
}
注意すべき重要なことは、|thing_inside_the_pipes|
は、一貫して使用している限り、何でもかまいません。そして、それが私たちが話しているループであることを理解してください、それは私が後でまで得なかったものでした。
@names.each do |name|
puts "Hello #{name}!"
end
http://www.Ruby-lang.org/en/documentation/quickstart/4/ には以下の説明が付いています。
each
はコードのブロックを受け入れ、リスト内のすべての要素に対してそのコードのブロックを実行するメソッドです。do
とend
の間のビットはまさにそのようなブロックです。ブロックは、匿名関数またはlambda
のようなものです。パイプ文字間の変数は、このブロックのパラメーターです。ここで起こることは、リスト内のすべてのエントリについて、
name
がそのリスト要素にバインドされ、次に式puts "Hello #{name}!"
はその名前で実行されます。
Javaの同等のものは
// Prior definitions
interface RespondToHandler
{
public void doFormatting(FormatThingummy format);
}
void respondTo(RespondToHandler)
{
// ...
}
// Equivalent of your quoted code
respondTo(new RespondToHandler(){
public void doFormatting(FormatThingummy format)
{
format.html();
format.xml();
}
});
ブロックのパラメーターは、|
記号。
必要に応じて、さらに明確にするために:
パイプバーは、基本的に新しいメソッドを作成し、前のメソッド呼び出しから生成された値を保持します。次のようなもの:
メソッドの元の定義:
def example_method_a(argumentPassedIn)
yield(argumentPassedIn + 200)
end
使用方法:
example_method_a(100) do |newVariable|
puts newVariable;
end
これを書くのとほとんど同じです:
newVariable = example_method_a(100)
puts newVariable
ここで、newVariable = 200 + 100 = 300:D!