Ruby模块前置与派生

mui*_*ine 5 ruby

有什么区别:

module Mod   
   def here
     puts 'child'
   end    
end

class A
  prepend Mod
  def here
    puts 'parent'
  end
end
Run Code Online (Sandbox Code Playgroud)

和

class A
   def here
     puts 'parent'
   end
end

class B < A
  def here
    puts 'child'
  end
end
Run Code Online (Sandbox Code Playgroud)

或者另一种说法:派生一个类与预先设置孩子代码的模块一样?

Jör*_*tag 4

不它不是。B只能从一个类继承,但Mod可以前置到多个类。如果您要调用superinside B#here,它将始终引用A#here,但在 of 内部Mod#here,它将引用前置的#here任何类的实例方法:Mod

module Mod   
  def here
    super + ' Mod'
  end    
end

class A
  prepend Mod
  def here
    'A'
  end
end

class B
  prepend Mod
  def here
    'B'
  end
end

A.new.here
# => 'A Mod'

B.new.here
# => 'B Mod'
Run Code Online (Sandbox Code Playgroud)

和

class A
  def here
    'A'
  end
end

class B
  def here
    'B'
  end
end

class C < A
  def here
    super + ' C'
  end
end

C.new.here
# => 'A C'

class C < B
  def here
    super + ' C'
  end
end
# TypeError: superclass mismatch for class C
Run Code Online (Sandbox Code Playgroud)