Ruby 执行相同的代码块(产量)
如何确保该方法执行一次。如果将方法A作为块插入方法Ai内部,则不执行辅助方法。大概是这样的:Ruby 执行相同的代码块(产量),ruby,methods,block,yield,Ruby,Methods,Block,Yield,如何确保该方法执行一次。如果将方法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|" 不是这样的: de
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|"
不是这样的:
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|"
在当前示例中,递归调用函数a
两次
如果您按照以下方式更改代码,它将只执行一次块并获得您描述的输出:
def a
puts "|start|"
yield
puts "|end|"
end
a do
puts "|test_one|"
puts "|test_two|"
end
在您的示例中,方法
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|
您正在调用方法
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|
如果要查看块是否返回,请在屈服
之前添加放置
def a
puts "|start|"
puts yield
puts "|end|"
end
然后以同样的方式调用您的方法,现在输出将是
|start||start||test_one||end||start||test_two||end||end|
如果我遗漏了什么,请纠正我。您的示例无法运行,
a“| test|one |”
将返回“无效的参数数,因为您需要为方法a
@Grych I corrected example提供一个块。该块”| test one仍然不是一个好的示例|“
只返回字符串,不向控制台写入任何内容。请解释清楚你想要什么archive@Grych我不明白如何更改方法a
,以得到这样的结果:=>|开始| |测试|一| |测试|二| | |
这是一个简单的例子。在现实世界中,它是更复杂的设计。我需要使用这个:a做一个{{测试{u一{}a{{{测试{u二}结束,我不知道如何改变方法:def a放置“|开始|”除非这里有一些条件产生放置“|结束|”除非这里有一些条件结束