如何在其实例上调用类方法?

时间:2017-11-28 20:07:17

标签: ruby oop

a1A上的一种方法。

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

3 个答案:

答案 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,但这通常是过度的。