用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 条评论
登录 后参与评论

相关文章

TOP 榜单

  1. 1

    来自Microsoft Office加载项taskpane.js的MySQL驱动程序模块的空引用

  2. 2

    使用AWS Cognito和React的仅限Facebook / Google的登录名(无用户名/密码)

  3. 3

    创建Windows Phone 8应用并将其连接到数据库的最佳方法(最好是SQL Server)

  4. 4

    为什么Java中的System.out.println()打印到控制台?

  5. 5

    卷曲函数无法解析来自bash中变量的代理

  6. 6

    是什么在Android的consumer-rules.pro和proguard-rules.pro之间的区别?

  7. 7

    设置与Apache POI Excel表散点图标记图标的颜色

  8. 8

    将Qt Pyside2与asyncio await语法一起使用?

  9. 9

    崇高的文字+蟒蛇的蟒蛇

  10. 10

    任务':app:minifyReleaseWithR8'.java.lang.NullPointerException的执行失败(无错误消息)

  11. 11

    OpenJDK的和AdoptOpenJDK的区别

  12. 12

    大型数据集缓存到Spark内存中时,“超出了GC开销限制”(通过sparklyr和RStudio)

  13. 13

    “执行测试CMAKE_HAVE_LIBC_PTHREAD”失败实际上是什么意思?

  14. 14

    使用Core 2.2中的Identity,如何在关闭浏览器15分钟后保持会话活动?

  15. 15

    React中的ForwardRefExoticComponent和ForwardRefRenderFunction有什么区别?

  16. 16

    猫鼬查找结果,然后将字段替换为findOne

  17. 17

    如何降级Google Colab的Torch版本

  18. 18

    Keras提前停止回调错误,val_loss指标不可用

  19. 19

    如何避免VSCode中的“导入路径不能以.ts扩展名结尾”错误?

  20. 20

    Nuxt.JS:如何在页面中获取路由URL参数

  21. 21

    是否有为什么会AccessibilityManager.sInstance导致内存泄漏的一个原因?

热门标签

归档