gpt4 book ai didi

ruby - "at"印记 (@) 在 Ruby 函数中给出什么范围?

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:39 25 4
gpt4 key购买 nike

自从我上次进行 Ruby 编程以来已经有一段时间了 -- 查看别人的代码,我在函数中看到了 @ 标记(不是方法 -- 外部到任何类定义),我理解为实例成员的范围。

模块是函数中隐含的self吗?

最佳答案

在顶层函数(实际上仍然是一个方法)中,您处于一个有点奇怪的地方:全局“主”空间(运行 irb 时查看提示,或尝试查看at self inside such a function),但这些函数也被定义为 Object 类中的私有(private)方法。

$ cat foo
def foo
p self
p self.class
puts 'foo'
end

foo
Object.foo

$ ruby foo
main
Object
foo
foo:8: private method `foo' called for Object:Class (NoMethodError)
$

您可以通过显式声明这些方法 public 来绕过这个问题,但我不确定我是否喜欢这样!奇怪的是,如果您在 irb 中定义了一个顶级方法,那么您可以通过类方法 Object#foo 调用它而无需将其声明为 public。

所以这是一种“隐含的主命名空间被黑进了Object(但嘘不要告诉任何人)”。 @foo 在顶级函数中定义,在 Object 中可用,作为一个普通的旧属性。有点。如果您的顶级方法设置了 @foo 并且您在没有作用域的情况下调用它,那么它会在类似特征的 main 命名空间中声明,但是如果您通过 Object 然后 @foo 出现在 Object 的空间。

另一个例子:

public
def set_foo
@foo = 'foo'
end

def get_foo
@foo
end

def Object.get_foo_again
@foo
end

set_foo
p get_foo
p Object.get_foo_again

Object.set_foo
p Object.get_foo_again

给予

"foo"  # @foo set in main
nil # @foo nil in Object
"foo" # @foo in Object

反之亦然。

关于ruby - "at"印记 (@) 在 Ruby 函数中给出什么范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837665/

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