首先看一段 Ruby 代码
#定义
module A
def self.a
puts 'a'
end
end
#使用
A.a
上面可以看到定义了一个 A 模块,然后在被使用时是通过 A 模块来调用 a 这个类方法。 但是我认为模块的从根本上是为了解决代码复用问题而存在,模块封装了一组被公用的常量/方法/变量,供其他模块/类进行引入。 在上面的代码中出现了两个不规范的地方 1.模块中不应该定义类方法,因为模块中的类方法永远无法被 include 成为目标类的类方法,这违反了模块设计的初衷。 2.如果希望某个方法以类方法的形式被调用到,使用 class 进行封装。 请大家给出意见。谢谢。么么哒。 -------update------- 原贴内容有点误人子弟了。 我原本以为 module 从设计上是为了
请问从楼主的角度,能否给出不要把类方法定义在模块中的理由呢?
首先模块中允许定义类方法,且在很多场景下就应该这么干,例子到处都是(其实我觉得不应该叫类方法,而应该叫静态方法,或者 static method 感觉更合适,至少 ES6,Swift 都是这样叫的)
除了在模块中用 self.method_name
来定义之外,还有很多种办法达到同样的结果。
module A
extend self
def a
puts 'a'
end
end
还有
module A
def a
puts 'a'
end
module_function :a
end
#2 楼 @sennmac module 中定义类方法是有用的,不是说无法被类 include 并当作类的类方法用,在 module 中定义类方法就不符合"规范"。
随便搜了一个例子,也许不能说明实际问题 https://gist.github.com/sshaw/53c27b148e903a07e494
#4 楼 @sennmac 我随便搜了一个例子,是 module_function 的一个应用场景,刚刚仔细看了一下,发现这个例子不太合适。换个 Sinatra 中的 Delegator 的实现,主要是证明在 module 中定义类方法并不是没用,而是很有用,具体取决于场景。
https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1976
module 的两个作用一个是 namespace,一个是 mixin,如果是 module with class method 可以理解为加了 namespace global function,如果没有 module 那不就是 global function 了吗 Math.sqrt
倘若你 program 和内部的 instance variable 无关,无须实例化,我觉得没必要放在 class 里,当然放在 class 也没有问题 class 就是继承 module 的,放 class 就等于放在 module 里了,其次 java 就是通过把 class method 封装在 class 里的来实现类似的裸 function 机制,当然 java 是没有 module 的概念的