1

私はこのコードが完全に正しくないかもしれないことを知っています:

def print_string(&str)
puts str
end

print_string{"Abder-Rahman"}

しかし、私がそれを実行すると、これが私が得るものです:

#<Proc:0x03e25d98@r.rb:5>

この出力は何ですか?

4

4 に答える 4

5

これは、Procオブジェクトのデフォルトの文字列表現です。「Abder-Rahman」は中括弧で囲まれているため、Rubyはブロックを定義していると見なします。str.call関数定義の中に入れるつもりでしたか?これでブロックが呼び出され、ブロック内で定義した文字列式が返されます。

于 2011-08-12T17:27:57.523 に答える
4

print_string問題は、 " "メソッドがブロック引数(紛らわしい名前の " ")を取ることを宣言しstr、proc自体を出力するだけであるということです。指定されたプロシージャを呼び出して、返される文字列値を確認することをお勧めします。

def call_proc(&proc)
  proc.call
end
call_proc { 'Foobar' }
# => "Foobar"

あなたが発見したのは、メソッド定義の最後の引数をアンパサンドで装飾する&と、メソッド呼び出しのブロック引数にバインドされるというシンタックスシュガーです。同じタスクを実行する別の方法は次のとおりです。

def call_proc2
  yield if block_given?
end
call_proc2 { 'Example' }
# => 'Example'

Procオブジェクト(またはProcコンストラクターの「ラムダ」エイリアス)を使用して、プロシージャをオブジェクトとして直接処理できることにも注意してください。

p1 = Proc.new { 'Foo' }
p1.call # => "Foo"
p2 = lambda { 'Bar' }
p2.call # => "Bar"
于 2011-08-12T17:28:45.393 に答える
2

&プレフィックスとその呼び出し方法で示されているように、ブロックをメソッドに渡します。次に、そのブロックは内部でProcに変換されます。

puts str.callメソッド内で文字列が出力されますが、この方法でメソッドを定義する理由は別の問題です。

Procを参照してください: http ://www.ruby-doc.org/core/classes/Proc.html

于 2011-08-12T17:28:09.810 に答える
0

関数/メソッドの最後の引数の前に&文字が付いている場合、rubyはprocオブジェクトを期待します。そのため、putsの出力はそれが何であるかです。

このブログには、単項演算子と演算子に関する記事があります。

于 2011-08-12T17:28:29.560 に答える