Ruby - 这是什么输出

时间:2011-08-12 17:22:50

标签: ruby proc-object

我知道这段代码可能不太正确:

def print_string(&str)
puts str
end

print_string{"Abder-Rahman"}

但是,当我运行它时,这就是我得到的:

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

这是什么输出?

4 个答案:

答案 0 :(得分:5)

这是Proc对象的默认字符串表示形式。因为“Abder-Rahman”在括号中,Ruby认为你正在定义一个块。您的意思是将str.call放在函数定义中吗?这应该调用你的块并返回你在其中定义的字符串表达式。

答案 1 :(得分: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 objects(或者Proc构造函数的“lambda”别名)直接将过程作为对象处理:

p1 = Proc.new { 'Foo' }
p1.call # => "Foo"
p2 = lambda { 'Bar' }
p2.call # => "Bar"

答案 2 :(得分:2)

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

你方法中的

puts str.call会打印字符串,不过为什么你想用这种方式定义方法是另一回事。

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

答案 3 :(得分:0)

当函数/方法的最后一个参数前面有&字符时,ruby期望一个proc对象。这就是为什么puts的输出就是它的原因。

This blog has an article about the unary & operator.