调用类方法时可以修改类吗?或者仅用于设置属性,例如此示例。
class UnitedStatesPresident
def self.citizenship
"United States of America"
end
end
p UnitedStatesPresident.citizenship
答案 0 :(得分:2)
你可以使用类方法修改类。这是一个定义新类方法的示例,其目的是在定义类之后向类(本身)添加方法:
class UnitedStatesPresident
def self.citizenship
"United States of America" # Notice the absence of backticks (`)
end
def self.create_method(name, &block)
self.class.send(:define_method, name, &block)
end
end
p UnitedStatesPresident.citizenship # => "United States of America"
UnitedStatesPresident.create_method(:name) do
"Barack Obama"
end
p UnitedStatesPresident.name # => "Barack Obama"
有关详细信息,请参阅文档:http://www.ruby-doc.org/core-2.1.2/Module.html#method-i-define_method
编辑:请注意,文档的作者使用上面示例中的#send发送#define_method消息,该消息是私有的。作者不情愿地这样做,将这种风格称为“黑客”。
答案 1 :(得分:1)
是的,您可以使用“类方法”修改类。 (注意,实际上,没有类方法这样的东西。类方法只是单例方法,就像任何其他单例方法一样。事实上,单例方法也不存在,它们只是单例类的常规实例方法。或者,它们只是类的实例方法,即Class
或其任何超类(Module
,Object
,BasicObject
)。)
事实上,我很惊讶您没有遇到过修改类的类方法!以下是一些例子:
Module#private
不带参数:将其后定义的方法的默认可见性设置为private
Module#protected
不带参数:将其后定义的方法的默认可见性设置为protected
Module#public
不带参数:将其后定义的方法的默认可见性设置为public
Module#attr_reader
生成一个getter方法Module#attr_writer
生成一个setter方法Module#attr_accessor
生成一个getter / setter方法对Module#include
将模块作为超类Module#prepend
将模块混合到Module#alias_method
创建方法的副本Module#const_set
设置常量Module#remove_const
删除常量Module#class_variable_set
设置了一个类变量Module#remove_class_variable
删除了一个类变量Module#define_method
定义了一种方法Module#undef_method
取消定义方法Module#remove_method
删除方法Module#refine
创建了一个改进Module#using
激活优化我很惊讶你还没有遇到alias_method
,private
或attr_*
。