gpt4 book ai didi

Ruby:这些自扩展有什么区别?

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

所以我可以通过三种不同的方式在模块上使用类级别的方法:

如果我有 3 个或更少,我通常这样做:

module Foo
def self.speak
"Foo"
end
end

如果我有更多,我传统上是这样做的:

module Bar
class << self
def speak
"Bar"
end
end
end

但最近,我遇到了这个绝妙的方法,并开始更频繁地使用它:

module FooBar
extend self

def speak
"FooBar"
end
end

它们都有效:

Foo.speak => "Foo"
Bar.speak => "Bar"
FooBar.speak => "FooBar"

那么,是否有任何实质性差异或陷阱需要注意,尤其是。用最后一种形式?我能想到的唯一真正的陷阱是,一旦你“扩展 self ”,所有遵循的方法定义都是类级别的。

我曾尝试考虑一些极端情况,其中一种形式有效,但另一种无效。有吗?

最佳答案

第三种形式与前两种不同,它创建了一个实例方法:speak 和一个模块方法:speak:

module Foo
def self.speak
"Foo"
end
end
Foo.methods.include?(:speak) #=> true
Foo.instance_methods.include?(:speak) #=> false

class A
include FooBar
end
A.instance_methods.include?(:speak) #=> false

module Bar
class << self
def speak
"Bar"
end
end
end
Bar.methods.include?(:speak) #=> true
Bar.instance_methods.include?(:speak) #=> false

class A
include Bar
end
A.instance_methods.include?(:speak) #=> false

module FooBar
extend self
def speak
"FooBar"
end
end

FooBar.methods.include?(:speak) #=> true
FooBar.instance_methods.include?(:speak) #=> true

class A
include FooBar
end

A.instance_methods.include?(:speak) #=> true

关于Ruby:这些自扩展有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30987104/

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