Ruby Scope / Bindings

时间:2014-10-29 23:05:27

标签: ruby

以下Ruby代码片段的输出

def foo; "foo:function"; end
puts foo
puts foo()
foo = "foo:value"
puts foo
puts foo() # Didn't expect this to work!

foo:function
foo:function
foo:value
foo:function

这很令人费解,我原本认为在当前范围内只有一个绑定foo,但看起来并非如此。

PS:在python中运行等效代码会得到预期的结果(即在将字符串绑定到foo之后,尝试调用foo()的最后一个语句会产生错误)。

修改

以下是python中的等效示例:

def foo(): return "foo:function"
print foo
print foo()
foo = "foo:value"
print foo
print foo() 

产生输出(已编辑):

<function foo at 0x7fb71d912578>
foo:function
foo:value
TypeError: 'str' object is not callable

编辑2:

所以,在Ruby中,与Python不同,给定的符号在同一范围内可以有两个绑定(作为方法和实例变量)。

1 个答案:

答案 0 :(得分:2)

在没有括号的情况下尝试put foo,你将得到&#34; foo:value&#34;。使用(),你明确地说这是一种方法。尝试将这两行放在代码的末尾:

puts defined? foo #=> local-variable
puts defined? foo() #=> method

您可能会发现this SO answer有用,尤其是这一部分:

  

为什么局部变量对于&#34; shadow&#34;方法而不是   绕道而行?好吧,如果方法确实影响局部变量,那么   将不再是取消引用那些局部变量的方法。   但是,如果局部变量为阴影方法,那么还有一种方法   调用这些方法:记住,歧义只存在   无接收无参数方法调用,如果添加显式   接收器或显式参数列表,您仍然可以调用方法: