来说说ruby里面定义类方法的区别:
class T
def T.class_method1
#第一种
end
class << self
def class_method2
#第二种
end
end
def self.class_method3
#第三种
end
end
def T.class_method4
#第四种
end
T.class_eval do
def T.class_method5
#第五种
end
def self.class_method6
#第六种
end
end
class Object
# The hidden singleton lurks behind everyone
def metaclass; class << self; self; end; end
def meta_eval &blk; metaclass.instance_eval &blk; end
# Adds methods to a metaclass
def meta_def name, &blk
meta_eval { define_method name, &blk }
end
end
T.meta_def :class_method7 do
#第七种
end
p T.singleton_methods.sort#["class_method1", "class_method2", "class_method3", "class_method4", "class_method5", "class_method6", "class_method7", "yaml_tag_subclasses?"]
区别:个人感觉用元编程方式定义的更动态一些灵活一些(丫的,废话!不动态不灵活还算是元编程吗)
还有就是用第二种(class << self )可以实现更多的功能
比如有人说类方法都是public的,还比如有人说类方法不能用别名...
其实用class << self 这种形式是可以实现的,下面看两个例子:
1.
class TT #很YD的类名...
class << self
private
def private_class_method
#这个有啥用?鬼知道有啥用!
end
end
end
TT.private_class_method# private method `private_class_method' called for TT:Class (NoMethodError)
2.
class TT#再YD一次..
class <<self
def class_m
puts "class method"
end
alias alias_class_m class_m
end
end
TT.alias_class_m#class method
终上所述,如果要动态添加或改变class method的时候用元编程,正常情况下用class << self这种形式。。