在轨道上的ruby中的模块和多重继承?

时间:2015-08-17 14:17:09

标签: ruby-on-rails module multiple-inheritance

我学习模块在ruby on rails上表现为多重继承。我看到了一个我理解的例子但是如果两个模块有相同的方法然后调用一个怎么办?

module A
  def a1
  end

  def a2
  end
end

module B
  def a1
  end

  def b2
  end
end

class Sample
  include A
  include B

  def s1
  end
end

samp=Sample.new
samp.a1
samp.a1

2 个答案:

答案 0 :(得分:4)

Ruby没有多重继承。 Ruby有类似的名为mixins的东西,可以使用模块实现。

Mixins不是多重继承,而是主要消除了它的需要。

要回答您的问题,当您在一个类中包含两个模块并且它们都具有相同名称的方法(在您的情况下,方法为a)时,在这种情况下,a方法来自将调用第二个(最后一个)模块。

module A
  def a1
    puts "I am defined in A"
  end

  def a2
  end
end

module B
  def a1
    puts "I am defined in B"
  end

  def b2
  end
end

class Sample
  include A
  include B

  def s1
  end
end

samp = Sample.new
puts samp.a1
# I am defined in B

为什么以及如何?

  

当模块M包含在类C中时,是匿名代理类   ⟦M'⟧(称为包含类)被创建为其方法表   指针指向M的方法表。 (对于常量表和   模块变量。)⟦M'⟧的超类设置为C的超类和C的   超类设置为⟦M'⟧。

此外,如果M包含其他模块,则递归应用该过程。

puts Sample.ancestors.inspect
# [Sample, B, A, Object, Kernel, BasicObject]

当您检查ancestors班级的Sample时,会更加清晰。在这里查看订单。调用a方法时,Ruby首先在Sample类本身中查找方法定义,但找不到它。然后,它在a中查找B方法,然后找到并调用它。

希望你现在很清楚。

答案 1 :(得分:0)

最后的胜利。在您的示例中(您可以尝试自己在控制台上使用print语句运行它),将调用的a1方法是B中定义的方法。