gpt4 book ai didi

ruby - 何时对 Ruby 类使用 self

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

有人能帮我区分当我们在内部创建方法时class << self block ,当我们定义普通方法时。

我在某处看到过这样的代码,但我不太清楚它们的用例

class Foo
def initialize
end

def bar
end

class << self
def foobar
end
end
end

最佳答案

class 中定义的方法 block 是实例方法:

class Foo
def bar
end
end

class << self 中定义的方法在 class 里面 block 是类方法:

class Foo
class << self
def baz
end
end
end

实例方法可用于给定类的任何实例:

foo = Foo.new
foo.bar

而类方法可以直接在类上调用:

Foo.baz

尝试在类上调用实例方法或反之亦然会导致错误:

Foo.bar #=> NoMethodError: undefined method `bar' for Foo:Class
foo.baz #=> NoMethodError: undefined method `baz' for #<Foo:0x00007ffe20055a20>

定义类方法的另一种方法是在方法名称前加上self. 前缀。 :

class Foo
def self.baz
end
end

您也可以在 class 之外定义它们 block ,虽然这很少见:

def Foo.baz
end

或者类似的:

class << Foo
def baz
end
end

请注意,以这种方式定义方法不仅限于类。您可以向任意对象添加方法,例如:

o = Object.new

def o.hello
"hello from o"
end

o.hello
#=> "hello from o"

或通过:

class << o
def hello
"hello from o"
end
end

在内部,这些方法被添加到对象的单例类。这是一个特殊用途的类,用于保存该实例的方法:

o.singleton_class.instance_methods(false)
#=> [:hello]

对于 Foo上面的类:

Foo.instance_methods(false)                 #=> [:bar]
Foo.singleton_class.instance_methods(false) #=> [:baz]

所以从技术上讲,类方法只是在类的单例类上定义的实例方法。

关于ruby - 何时对 Ruby 类使用 self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56676876/

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