[英]Why can't we pass a {} block with other parameters to a method in Ruby
当使用其他参数将块传递给使用ruby的方法时,为什么我们必须这样做
def method4(condition, attribute, &block)
return "No Block" if block.nil?
if condition
block.call
end
puts attribute
end
method4(true,4) do
puts "Hello World"
end
虽然我们不能那样做
method4(true,4,{puts "Hello World"})
显然后者在语法上是错误的
您只能将其他对象作为参数传递,而块不是Ruby中的对象。 块是句法构造。
但是它们可以轻松地包装在Proc
类的对象中。 甚至还有一个特殊的速记运算符:
method4(true, 4, &->{puts 'Hello World'})
上面的代码的简短说明:
->{}
在给定的块周围创建一个Proc
对象。 由于method4
需要一个块而不是一个对象,因此您需要“解开”它以再次阻止,这就是与号存在的原因。 如果改为method4
的签名:
def method4(condition, attribute, proc) # note no ampersand
您也可以在方法调用中省略“&”号。
调用带块方法的正确语法是method_name(arguments) { stuff() }
在method4(true,4,{puts "Hello World"})
,花括号会给您带来语法错误,因为它可能是Hash对象,例如: method4(true, 4, {puts: "Hello World"})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.