在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)
理想情况下,
Object类中定义,而Kernel模块中。Kernel#puts,例如不对其接收器做任何事情;它不调用私有方法,也不访问它的任何实例变量,它只作用于它的参数。
Ruby 中的过程是通过使用 Ruby 的特性来伪造的,即等于的接收器self可以被省略。它们还经常被设为私有,以防止它们被显式接收器调用,从而更加混乱。例如,"Hello".puts会打印一个换行符puts而不打印其他任何东西,因为只关心它的参数,而不是它的接收者。通过将其设为私有,它只能被称为puts "Hello".
实际上,由于 Ruby 的悠久历史,这种分离并不总是得到严格遵守。由于某些Kernel方法被记录在文件中Object,反之亦然,这也变得更加复杂,甚至当您定义一些看起来像全局过程的东西时,根据上述推理Kernel,它实际上应该以最终成为Object.