我有一个带块的功能。这个块也需要一个块:
def fn
yield do n
puts n
end
end
fn do
yield 1
end
此代码应打印“1”。然而,实际上它失败了:
语法错误,意外的keyword_do
我可以让函数取代proc:
def fn(&block)
block.() do n
puts n
end
end
但是在这种情况下,代码在yield行上失败:
没有给定块(yield)(LocalJumpError)
我不想让内部块成为proc:
fn do |&block|
block.(1)
end
因为它看起来很糟糕。相反,我宁愿屈服,至少在内部区块。我该如何解决这个问题?
答案 0 :(得分:1)
你使用procs的问题是你使用丑陋的语法。这就是他们看起来很糟糕的原因。 .call
的使用更为常见:
def fn(&block)
block.call do |n|
puts n
end
end
fn do |&block|
block.call(1)
end
至于为什么你的两次尝试失败,按顺序:
yield
是关键字,而不是方法调用。这就是为什么你没能通过它的原因。yield
产生当前块。但是在该上下文中没有块:fn
调用不在传递块的方法调用中。它作为顶级表达式执行。总结:使用过程。放弃希望用yield
。
答案 1 :(得分:0)
你不能单独从一个块中屈服。 yield
关键字始终作用于方法的范围。请参阅documentation for method definitions或documentation for Ruby keywords:
收益强>
开始执行发送到当前方法的块。