我知道这段代码可能不太正确:
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
"),并且您只是打印过程本身。您可能希望调用给定的过程来查看它返回的字符串值:
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构造函数的"lambda"别名)直接作为对象来处理:
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
的输出是这样的。
这个博客有一篇关于一元& &;操作符。