2009-03-20 5 views
56

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

私は、RubyとRoRのを学ぶPHPとJavaの背景から来るが、私はこのようなコードを越えてくるよ:|format|部分が

def new 
    @post = Post.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @post } 
    end 
end 

は何をしているのですか? PHP/Javaのパイプシンボルと同等の構文は何ですか?

答えて

42

ブロックに与えられた変数です。

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」です。 http://www.ruby-lang.org/en/documentation/quickstart/4/

+0

'| wtf |'ブロックが終了したら 'wtf'はどこに行きますか? – ThorSummoner

+0

ブロックにスコープが設定されているため、ブロックの外側にはありません。言い換えれば、それは消え去る。 –

+0

変更可能な場合は?そうでなければ、Vagrantfileが設定方法としてどのようにそれらを使用することができるかわからない。 – ThorSummoner

5

doからendまでのコードは、Ruby blockを定義しています。単語formatはブロックのパラメータです。ブロックはメソッド呼び出しとともに渡され、呼び出されたメソッドはブロックにyield値を渡すことができます。

詳細については、Rubyのテキストを参照してください。これはRubyの核となる機能です。 Javaで

+1

いいえ、doとendの間のコードはルビブロックです。垂直バーの間の用語は、そのブロックのパラメータです。 – rampion

+0

IIRCでは、パイプ構文はSmalltalkから借用されています。 –

+0

スモールトークが1本のパイプを使用したことを除いて、 – Chuck

3

同等は|シンボル間のブロック座るため

// 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(); 
    } 
}); 
+0

ブレント、もしそれが意味するのであれば、Javaのバージョンは冗長であり、言い方である - 私はあなたに同意するだろう。しかし、やはりこれはJavaではあまり慣れない構造です。 Rubyは常にJavaを使用しています。 –

+0

format.html(); format.xml();おそらくswitch文のようになります。なぜなら、要求された形式を切り替えるからです。 – jonnii

+0

より洗練された例はJavaScriptの同等の構造です:respond_to(new function(format){format.html(); format.xml();}); 私はJavaの真のファンクタサポートの欠如が本当に迷惑であることがわかりました。あなたがJavaで匿名のクラスでそれらを学んでいない限り、彼らは全く使用することは難しくありません! –

2

パラメータのようなものになるだろう。

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

この説明を伴う:

eachは、リスト内のすべての要素のためのコードのブロックを実行し、コードのブロックを受け入れ方法、及びdo間のビットであり、そしてendはちょうどそのようなブロックです。ブロックは無名関数、つまりlambdaに似ています。パイプ文字間の変数は、このブロックのパラメータです。

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

24

これは私にとっても非常に奇妙でしたが、私はこの説明/ウォークスルーがあなたを助けることを願っています。

ドキュメントtouches the subjectは、非常に良い方法で - 私の答えが助けにならないなら、私は彼らのガイドが確信していると確信しています。

まず、シェルにirbと入力してと入力して、対話型Rubyインタプリタを起動します。を入力します。私たちが一緒にプレイする配列を持っているだけのように

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|がいる限り、何でもできることです。

他の言語では、あなたのような何かを書く必要があるだろう。私たちが話しているのはループだということを理解しています。それは後になるまでは得られなかったことです。

+2

いくつかの "他の言語"(Python)では、 'lineustorvaldsをprint_inumbers do_numbersに書く 'と書いています。おそらく少し直感的です。 –

+1

絶対に正しい。私はCスタイルのシンタックスを選択しました。なぜなら、ルビーに来る人が増えていると思うからです。あなたのコメントも読んでくれることを願っています。 –

+0

ありがとうございます。 「その他の言語」セクションは、何が起こっているのか理解するのに役立ちました。 +1。 – rayryeng

1

必要であれば、それがさらに明確にするには、次の

パイプバーは、本質的に、メソッド呼び出し前から生成された値を保持する新しい変数を作成します。何か似へ:

あなたの方法のオリジナルの定義:それは使われていますどのように

def example_method_a(argumentPassedIn) 
    yield(argumentPassedIn + 200) 
end 

newVariable = example_method_a(100) 
puts newVariable 

example_method_a(100) do |newVariable| 
    puts newVariable; 
end 

それはこれを書いてとほぼ同じです

wher e、newVariable = 200 + 100 = 300:D!

関連する問題