要定义一个类,我必须执行以下操作(例如(
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 元编程(西班牙语(以及如何实现您正在寻找的内容,它还具有负责该页面的人员,因此出于学术原因,您可以随时向他们发送电子邮件(假设您是该班的学生(。
干杯!