以下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不同,给定的符号在同一范围内可以有两个绑定(作为方法和实例变量)。
答案 0 :(得分:2)
在没有括号的情况下尝试put foo,你将得到&#34; foo:value&#34;。使用(),你明确地说这是一种方法。尝试将这两行放在代码的末尾:
puts defined? foo #=> local-variable
puts defined? foo() #=> method
您可能会发现this SO answer有用,尤其是这一部分:
为什么局部变量对于&#34; shadow&#34;方法而不是 绕道而行?好吧,如果方法确实影响局部变量,那么 将不再是取消引用那些局部变量的方法。 但是,如果局部变量为阴影方法,那么还有一种方法 调用这些方法:记住,歧义只存在 无接收无参数方法调用,如果添加显式 接收器或显式参数列表,您仍然可以调用方法: