gpt4 book ai didi

ruby - 为什么 ruby​​ 中的变量前缀允许在方法调用中省略括号?

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

在 David Flanagan 的 The Ruby Programming Language 中;松本幸弘 they state that the variable prefixes ($, @, @@) are one price we pay for being able to omit parentheses around method invocations .谁可以给我解释一下这个?

最佳答案

这是我不成熟的意见。如果我错了,请纠正我。

假设实例变量没有@前缀,那么我们如何声明一个实例变量?

class MyClass
def initialize
# Here foo is an instance variable
self.foo = 'bar'
end

# Here foo is an instance method
def foo
end

def bar
# Call method. No doubt.
self.foo()

# Call method? Access instance variable?
self.foo
end
end

在上面的例子中,实例变量foo是使用假设的语法初始化的

self.foo = 'bar'

因为我们必须有办法告诉 ruby​​ 解释器 foo 属于当前实例,而不是局部变量。

那么在方法bar中,如果方法调用中不强制使用括号,解释器如何判断self.foo是方法调用还是实例变量访问?

也许我们可以在缺少括号时让实例变量隐藏实例方法,但这会导致语言本身的语法不一致。例如,在 MyClass 定义之外:

obj = MyClass.new

# Call instance method
obj.foo

这是一个实例方法调用,因为所有实例变量从外部都是不可见的(至少不使用元编程)。但是方法bar中的self.foo(没有括号)是实例变量访问。这种语法不一致可能会导致错误。此外,它给解释器本身的实现带来了困难。

那么让实例方法隐藏实例变量呢?然后程序员必须确保实例变量名称不会与实例方法名称冲突,否则实例变量将无法访问。如果一个类具有很长的祖先链,这将非常困难,因为必须不仅检查当前类定义中的冲突,还要检查其祖先中的冲突,这会破坏封装。

无论哪种方式,代价都比给实例变量加上前缀高很多。对于类和全局变量,情况类似。

关于ruby - 为什么 ruby​​ 中的变量前缀允许在方法调用中省略括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37245159/

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