私はこのコードが完全に正しくないかもしれないことを知っています:
def print_string(&str)
puts str
end
print_string{"Abder-Rahman"}
しかし、私がそれを実行すると、これが私が得るものです:
#<Proc:0x03e25d98@r.rb:5>
この出力は何ですか?
私はこのコードが完全に正しくないかもしれないことを知っています:
def print_string(&str)
puts str
end
print_string{"Abder-Rahman"}
しかし、私がそれを実行すると、これが私が得るものです:
#<Proc:0x03e25d98@r.rb:5>
この出力は何ですか?
これは、Procオブジェクトのデフォルトの文字列表現です。「Abder-Rahman」は中括弧で囲まれているため、Rubyはブロックを定義していると見なします。str.call
関数定義の中に入れるつもりでしたか?これでブロックが呼び出され、ブロック内で定義した文字列式が返されます。
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"
&プレフィックスとその呼び出し方法で示されているように、ブロックをメソッドに渡します。次に、そのブロックは内部でProcに変換されます。
puts str.call
メソッド内で文字列が出力されますが、この方法でメソッドを定義する理由は別の問題です。
Procを参照してください: http ://www.ruby-doc.org/core/classes/Proc.html
関数/メソッドの最後の引数の前に&
文字が付いている場合、rubyはproc
オブジェクトを期待します。そのため、puts
の出力はそれが何であるかです。