gpt4 book ai didi

ruby - 解释为局部变量会覆盖方法名称吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:12 24 4
gpt4 key购买 nike

this question ,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为 nil

x = x # => nil 

但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回 nil

{}.instance_eval{a = keys} # => []
{}.instance_eval{keys = self.keys} # => []
{}.instance_eval{keys = keys} # => nil

最佳答案

在 Ruby 中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:

foo

可能 要么 意味着“在 self 上不带参数调用方法 foo”或“取消引用局部变量 foo ".

如果在作用域中存在局部变量 foo,这总是被解释为局部变量取消引用,从不作为方法调用。

那么,局部变量“在范围内”意味着什么?这是在解析时句法确定的,不是在运行时语义上确定的。这是非常重要的!局部变量在解析时定义:如果解析器看到对局部变量的赋值,则局部变量从那时起就在范围内。但是,它仅在运行时初始化,没有对代码进行编译时评估:

if false
foo = 42 # from this point on, the local variable foo is in scope
end

foo # evaluates to nil, since it is declared but not initialized

为什么局部变量“隐藏”方法而不是绕过方法有意义?好吧,如果方法确实隐藏了局部变量,那么就没有办法取消对这些局部变量的引用了。但是,如果局部变量隐藏了方法,那么仍然有一种方法可以调用这些方法:记住,歧义只存在于无接收者无参数方法调用中,如果你添加一个显式接收者或一个显式参数列表,你仍然可以调用该方法:

def bar; 'Hello from method' end; public :bar

bar # => 'Hello from method'

bar = 'You will never see this' if false

bar # => nil

bar = 'Hello from local variable'

bar # => 'Hello from local variable'
bar() # => 'Hello from method'
self.bar # => 'Hello from method'

关于ruby - 解释为局部变量会覆盖方法名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12706664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com