Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 执行相同的代码块(产量)_Ruby_Methods_Block_Yield - Fatal编程技术网

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

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

如何确保该方法执行一次。如果将方法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|"
不是这样的:

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放置“|开始|”除非这里有一些条件产生放置“|结束|”除非这里有一些条件结束