a1
是A
上的一种方法。
module A
def self.a1
puts "I am defined in A"
end
end
class Sample
include A
end
samp = Sample.new
如何拨打samp.a1
?
puts samp.a1
答案 0 :(得分:2)
这里要记住以下几点:
self
前缀声明模块方法,这意味着他们可以直接在模块上调用,例如A.a1
,但这也意味着他们赢了&#39 ; t 导入include
。那些没有自我声明的是'#34;混合方法",或那些将自动导入include
的方法。include
多个模块定义了一个方法,那么包含的最后一个模块将是实际被调用的模块。此处的修复方法是将def self.a1
更改为def a1
中的module A
,或者直接使用A.a1
进行调用。如果B还定义了a1
,那么它将优先于,除非<{em>}首先include B
,否则优先级较低。
答案 1 :(得分:0)
如果你知道这种事情会提前发生,你可以使用别名,因为你包含了模块(注意这会将方法定义从def self.a1
改为def a1
,这样他们就可以了正确包含在实例方法中):
module A
def a1
puts "I am defined in A"
end
end
module B
def a1
puts "I am defined in B"
end
end
class Sample
include A
alias :a_a1 :a1
include B
alias :b_a1 :a1
end
samp = Sample.new
samp.a_a1
samp.b_a1
samp.a1
运行此输出:
I am defined in A
I am defined in B
I am defined in B
作为一般规则,我会避免这种情况,并重命名模块中的一种方法,如果你能够;虽然有时你因某种原因无法做到这一点。
答案 2 :(得分:0)
如果只是a1,那么这应该有效:
class Sample
include A
def a1
self.class.a1
end
end
如果您需要所有方法,可以尝试使用send-command为类捕获NoMethodError,但这通常是过度的。