用Ruby产生变量范围

肯尼迪先生

Ruby如何区分|n|在函数yield的情况下“ Kim”和在函数调用的情况下“ Eric”的代码块?

道歉,如果这很明显-我真的看不到|n|带有function(arg)调用的代码块中变量到底如何影响函数内部的yield调用?

def yield_name(name)
  puts "In the method! Let's yield..."
  yield("Kim")
  puts "... now in between the yields!"
  yield(name)
  puts "Block complete! Back in the method."
end

>>> yield_name("Eric") { |n| puts "My name is #{n}." }

In the method! Let's yield...
My name is Kim.
... now in between the yields!
My name is Eric.
Block complete! Back in the method.

就我所理解的代码块而言,它的意思是:“对于每个参数,在屏幕上显示“我的名字是#{that参数}”。Ruby如何将“ Kim”传递给“那个参数”,从而显示“ My name is Kim”。而不只是“金”?谢谢。

- - - - - - - - - - - 编辑

这是一个不太容易混淆的示例:

def double(parameter)
    yield parameter
    yield 7
end

当我调用时:

>>> double(3) { |n| puts "how? #{n * 2}" }

我得到:

how? 6  #<-- relative to function call(arg)
how? 14 #<-- relative to internal functions yield call(arg)

那么Ruby如何知道在puts语句中使用yield 7?

塞尔吉奥·图伦采夫

据我了解的代码块,它显示为“对于每个参数,将其显示在屏幕上“我的名字是#{那个参数}”。

不。从字面上看,它读取“将参数'Eric'yield_name传递给方法并传递此块”。您将一个块传递给方法这一事实并没有任何意义。该方法可以简单地不调用它(也称为“屈服”)。因此,在不知道该方法的实现的情况下,您无法对块调用次数或提供的参数值进行任何假设。

在这种情况下,我们确实知道实现

def yield_name(name)
  puts "In the method! Let's yield..."
  yield("Kim")
  puts "... now in between the yields!"
  yield(name)
  puts "Block complete! Back in the method."
end

在这里,我们看到每个调用都会yield_name调用其块两次。首先,使用静态值("Kim")。第二次,它只是中继其参数name如果此处没有yield语句,则您提供的块将被完全忽略(因此,将不会打印任何内容)。但是我们确实两次触发了该块,并在输出中看到了两行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章