除了设置类的属性/变量之外,Ruby中的类方法还有哪些其他用途?

时间:2014-09-03 02:25:33

标签: ruby

调用类方法时可以修改类吗?或者仅用于设置属性,例如此示例。

class UnitedStatesPresident

  def self.citizenship

     "United States of America"

 end

end

p UnitedStatesPresident.citizenship

2 个答案:

答案 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或其任何超类(ModuleObjectBasicObject)。)

事实上,我很惊讶您没有遇到过修改类的类方法!以下是一些例子:

  • 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_methodprivateattr_*