如何确保方法执行一次。如果方法A被插入到方法Ai内,则不执行对辅助方法的块。像这样:
def a
puts "|start|"
yield
puts "|end|"
end
a do
a { "|test_one|" }
a { "|test_two|" }
end
=> "|start||test_one||test_two||end|"
不喜欢这样:
=> "|start|test_one|start|end|test_two|end|"
答案 0 :(得分:1)
在您当前的示例中以递归方式两次调用函数a
。
如果您按照以下方式更改代码,它将只执行一次该块并获得您描述的输出:
def a
puts "|start|"
yield
puts "|end|"
end
a do
puts "|test_one|"
puts "|test_two|"
end
答案 1 :(得分:0)
在您的示例中,方法a
将运行三次,因为您在主要部分中执行一次,在块中执行两次。要获得所需的输出,您不必在块中运行此方法。只需执行包含两条指令的块:
irb(main):066:0> a do
irb(main):067:1* puts "|test_one|"
irb(main):068:1> puts "|test_two|"
irb(main):069:1> end
|start|
|test_one|
|test_two|
|end|
答案 2 :(得分:0)
您正在调用方法a
,但不会打印已经产生的块。
yield
替换作为参数传递的整个块,在写入它的方法中。
所以当ruby解释代码时,你的方法实际上会变成这样。
puts "|start|"
puts "|start|" #
"|test_one|" # replaced for yield on call `a {"|test_one|"}`
puts "|end|" #
puts "|start|" #
"|test_two|" # replaced for yield on call `a {"|test_two|"}`
puts "|end|" #
puts "|end|"
输出:
|start||start||end||start||end||end|
如果您想查看该块是否正在返回,请在puts
之前添加yield
def a
puts "|start|"
puts yield
puts "|end|"
end
然后以相同的方式调用您的方法,现在输出将是。
|start||start||test_one||end||start||test_two||end||end|
如果我遗失任何东西,请纠正我。