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 构造函数的“lambda”别名)直接作为对象处理:

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

您正在将一个块传递给该方法,如前缀 & 以及您如何调用它所表示的。然后该块在内部转换为 Proc。

puts str.call在您的方法内部将打印字符串,尽管您为什么要以这种方式定义方法是另一回事。

参见过程: http ://www.ruby-doc.org/core/classes/Proc.html

于 2011-08-12T17:28:09.810 回答
0

当函数/方法的最后一个参数以&字符开头时,ruby 期望一个proc对象。所以这就是为什么puts's 的输出是这样的。

这个博客有一篇关于一元 & 运算符的文章。

于 2011-08-12T17:28:29.560 回答