执行相同的代码块(产量)

时间:2015-01-27 18:44:36

标签: 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|"

3 个答案:

答案 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|

如果我遗失任何东西,请纠正我。