gpt4 book ai didi

ruby - 在 `main` 与 `Object` 中定义

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

是否相当于在主环境定义一个方法:

def foo; end

并将其定义为Object的实例方法:

class Object
def foo; end
end

或者有什么方法可以区分它们吗?

最佳答案

当你没有指定一个对象在其单例类中应该定义该方法时,即当你不说

def bar.foo; end

只是

def foo; end

然后该方法在所谓的 default definee 中定义.通常,默认定义者是词法封闭的 module,但在顶层,它是 Object 并且方法变为 private 默认情况下。 (也可以通过各种元编程方法更改默认定义。)

所以,您发布的两个片段是等价的,因为第一个将定义一个private 方法,第二个是一个public方法:

def foo; end

method(:foo).owner
# => Object

Object.private_instance_methods(false).include?(:foo)
# => true

但是

class Object; def foo; end end

method(:foo).owner
# => Object

Object.private_instance_methods(false).include?(:foo)
# => false

请注意,在 IRb 和其他一些 REPL 中,顶级方法可能以 public 结束。这是众所周知的不兼容性,泄露了这些 REPL 的私有(private)内部实现细节,不是Ruby 语义的官方部分。

关于ruby - 在 `main` 与 `Object` 中定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863297/

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