"-6ren">
gpt4 book ai didi

ruby - 顶层方法的定义

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

我想知道顶级方法的定义。

puts RUBY_VERSION #=> 2.1.5
def greet
"hello, world"
end
class Object
greet #=> "hello, world"
end

为什么 greet 表现得像私有(private)类方法?

puts RUBY_VERSION #=> 2.1.5
def greet
"good morning"
end

# case 1
Object.private_methods(false).grep /greet/ #=> []
# case 2
Object.private_instance_methods(false).grep /greet/ #=> [:greet]
# case 3
Object.private_methods(true).grep /greet/ #=> [:greet]

在案例3中,我发现greet是一个私有(private)类方法。但我想知道哪个类拥有 greet 作为私有(private)类方法。 对象继承自身?

编辑

我更新了我的问题。

问题#1

方法的定义是否意味着在Object中添加一些方法作为私有(private)实例方法。
这是正确的吗?

问题#2

ObjectClass 的实例。因此,Object 拥有私有(private)类方法。这些方法作为 Class 中的私有(private)实例方法。
这是正确的吗?

问题 #3

取决于问题 #1 和 #2。 Class 继承Object。因此,Class 拥有 greet 作为私有(private)类方法和私有(private)实例方法。这是正确的吗?

最佳答案

Why does greet act like private class method?

事实并非如此。它就像一个私有(private)实例方法。 (其实Ruby中没有类方法,只有实例方法,问题不在于方法是实例方法还是类方法,而在于实例方法定义在哪个类中。)

在顶层定义的方法成为 Object 的私有(private)实例方法。

# case 1
Object.private_methods(false).grep /greet/ #=> []
# case 2
Object.private_instance_methods(false).grep /greet/ #=> [:greet]
# case 3
Object.private_methods(true).grep /greet/ #=> [:greet]

In case 3, I found that greet is a private class method.

就像我上面说的:Ruby 中没有类方法。

greetObject 的私有(private)实例方法。 ObjectClass的实例,ClassModule的子类,ModuleObject 的子类,因此 ObjectObject 的实例,即它本身。

换句话说:Object 中定义的方法可用于所有对象。类也是对象,因此 Object 中定义的方法可用于所有类,包括 Object

But I'm wondering which class owns greet as a private class method.

没有。 Ruby 中没有类方法。 greetObject 的私有(private)实例方法。

Object inherits itself?

没有。 Object 本身的实例。

Question #1

Does definition of method mean adding some methods in Object as private instance method.
Is this correct ?

在顶层定义的方法成为 Object 的私有(private)实例方法。

Question #2

Object is an instance of Class. So, Object owns private class methods. These methods as private instance methods in Class.
Is this correct ?

抱歉,我无法解析您的问题。

但是,您的示例中没有 Class 的私有(private)实例方法。您的示例中唯一的方法是 greet,它是 Object 的私有(private)实例方法,而不是 Class

如果你想知道谁拥有一个方法,你可以直接问 Ruby:

method(:greet).owner
# => Object

Question #3

depends on question #1 and #2. Class inherits Object. So, Class owns >greet as private class method and private instance method. Is this correct ?

没有。 Ruby 中没有类方法,只有实例方法。而greet不属于Class,它是Object的私有(private)实例方法:

method(:greet).owner
# => Object

关于ruby - 顶层方法的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36193257/

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