module A
def go
p 'go'
end
end
module B
extend self
include A
def start
go
end
end
# doesn't work
# B.start
module C
include A
extend self
def start
go
end
end
# works
C.start
module Constants
HELLO = "Hello!"
end
module D
extend self
include Constants
def start
p HELLO
end
end
# works
D.start
有人可以向我解释一下吗?如果在C.start
之前include A
extend self
,Constants
如何运作?如果我只包括{{1}}?
任何帮助都将不胜感激,谢谢。
答案 0 :(得分:0)
为什么
D.start
有效?
因为extend self
将方法start
添加到D
的单例类中。看下面的两个例子:
extend self
module Constants
HELLO = "Hello!"
end
module D
#extend self
include Constants
def start
p HELLO
end
end
D.singleton_methods # => []
extend self
module Constants
HELLO = "Hello!"
end
module D
extend self
include Constants
def start
p HELLO
end
end
D.singleton_methods # => [:start]
为什么B.start不起作用?
这是因为您首先将模块B
的方法添加到其单例方法中,然后包含模块A
的方法,因此#go
未添加到{的单例方法中{1}}。看看下面的两个例子。
B
然后include A
。 extend self
可以在这里使用,因为您首先包含了从B.start
到A
的方法。然后将B
的所有方法(在B
中定义并包含在A
中的方法)添加到B
的单例类中。因此,B
内的#go
来电已成功。
B.start
module A
def go
p 'go'
end
end
module B
include A
extend self
def start
go
end
end
B.singleton_methods # => [:start, :go]
,然后是extend self
。 include A
在此不起作用,因为您首先将方法从B.start
扩展到A
,然后只将B
中的所有方法添加到单个类的B
。之后,您添加了B
中的方法,这就是A
未添加到#go
的单例类的原因。因此,B
内的#go
来电未成功。
B.start
我希望现在可以理解为什么module A
def go
p 'go'
end
end
module B
extend self
include A
def start
go
end
end
B.singleton_methods # => [:start]
有效了。