为什么Ruby模块内核存在?

Shi*_*imu 6 ruby oop

Ruby的OO Design一书中,Sandi Metz说模块的主要用途是用它们实现鸭子类型,并将它们包括在所需的每个类中。为什么Ruby Kernel是其中包含的模块Object?据我所知,它在其他任何地方都没有使用过。使用模块有什么意义?

小智 6

正如您已经指出的:模块提供了一种收集和构建行为的方法,内核模块也是如此。这个模块很早就混入到类 Object 中,因此每个 Ruby 类都将提供这些方法。在层次结构中之前只有一个 BasicObject,它的子 Objects 的目的只是为了通过 Kernel 方法进行扩展。BasicObject 只有 7 个非常非常基本的方法,例如new, __send__or __id__

class Object < BasicObject
  include Kernel # all those many default methods we appreciate :)
end
Run Code Online (Sandbox Code Playgroud)


Jör*_*tag 5

理想情况下,

  • 精神上的方法(适用于任何对象),即使用接收者的方法,应该在Object类中定义,而
  • 过程(全局提供),即忽略接收者的方法,应该收集在Kernel模块中。

Kernel#puts,例如不对其接收器做任何事情;它不调用私有方法,也不访问它的任何实例变量,它只作用于它的参数。

Ruby 中的过程是通过使用 Ruby 的特性来伪造的,即等于的接收器self可以被省略。它们还经常被设为私有,以防止它们被显式接收器调用,从而更加混乱。例如,"Hello".puts会打印一个换行符puts而不打印其他任何东西,因为只关心它的参数,而不是它的接收者。通过将其设为私有,它只能被称为puts "Hello".

实际上,由于 Ruby 的悠久历史,这种分离并不总是得到严格遵守。由于某些Kernel方法被记录在文件中Object,反之亦然,这也变得更加复杂,甚至当您定义一些看起来像全局过程的东西时,根据上述推理Kernel,它实际上应该以最终成为Object.