web-dev-qa-db-ja.com

Rubyのパイプシンボルは何ですか?

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のこれらのパイプシンボルの同等の構文は何ですか?

69
Philip Morton

それらは、ブロックに渡される変数です。

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」です。

52
August Lilleaas

これも最初は非常に奇妙でしたが、この説明/ウォークスルーがお役に立てば幸いです。

ドキュメンテーション 主題に触れる 、非常に良い方法で-私の答えが役に立たない場合、私は彼らのガイドが確信しています。

最初に、シェルで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|は、一貫して使用している限り、何でもかまいません。そして、それが私たちが話しているループであることを理解してください、それは私が後でまで得なかったものでした。

32
@names.each do |name|
  puts "Hello #{name}!"
end

http://www.Ruby-lang.org/en/documentation/quickstart/4/ には以下の説明が付いています。

eachはコードのブロックを受け入れ、リスト内のすべての要素に対してそのコードのブロックを実行するメソッドです。doendの間のビットはまさにそのようなブロックです。ブロックは、匿名関数またはlambdaのようなものです。パイプ文字間の変数は、このブロックのパラメーターです。

ここで起こることは、リスト内のすべてのエントリについて、nameがそのリスト要素にバインドされ、次に式puts "Hello #{name}!"はその名前で実行されます。

6
Philip Durbin

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();
    }
});
3
Jon Bright

ブロックのパラメーターは、|記号。

3
dylanfm

必要に応じて、さらに明確にするために:

パイプバーは、基本的に新しいメソッドを作成し、前のメソッド呼び出しから生成された値を保持します。次のようなもの:

メソッドの元の定義:

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!

1
Jesse