Ruby -输出是什么?



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

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的输出是这样的。

这个博客有一篇关于一元& &;操作符。

最新更新