在 Ruby 中重新定义"class"关键字



要定义一个类,我必须执行以下操作(例如(

class Foo
   #attr_accessors
   #methods
   #so on
end
foo = Foo.new #to create an instance

问题

我需要实现以下目标

case_class Foo_inmutable #I change class for case_class
   #attr_accessors
   #methods
   #so on
end
foo_inmutable = Foo_inmutable.new 
#->SyntaxError: uninitialze constant Foo_inmutable

我需要 ruby 解释器以与关键字相同的方式处理case_class

像几乎所有编程语言一样,Ruby 不允许你修改它的语法或语义。所以,你想要的是不可能的。

但是,您可以非常轻松地编写一个实现目标的方法,但无需更改 Ruby 的语法和语义:

class Module
  def case_class(name, superclass = ::Object, &blk)
    const_set(name, Class.new(superclass, &blk))
  end
end
def case_class(name, superclass = ::Object, &blk)
  self.class.case_class(name, superclass, &blk)
end
case_class :Foo_immutable do
#          ↑              ↑↑
# these are the only differences to your proposed syntax
  #attr_accessors
  #methods
  #so on
end
foo_immutable = Foo_immutable.new

要实现这一目标,除了定义上一个答案中已经说过的内容:

class Module
  def case_class(name, superclass = ::Object, &blk)
    const_set(name, Class.new(superclass, &blk))
  end
end
def case_class(name, superclass = ::Object, &blk)
  self.class.case_class(name, superclass, &blk)
end

你可能想看看const_missing方法,以及 ruby 对各种作用域内的常量所做的"查找">

这将允许你做这样的事情

case_class Foo do
...
end

有关进一步的说明,您可以参考此页面:tadp-utn-frba.github.io

它有大量有用的脚本来解释 ruby 元编程(西班牙语(以及如何实现您正在寻找的内容,它还具有负责该页面的人员,因此出于学术原因,您可以随时向他们发送电子邮件(假设您是该班的学生(。

干杯!

最新更新