重新定义;“类”;Ruby中的关键字

重新定义;“类”;Ruby中的关键字,ruby,class,syntax,Ruby,Class,Syntax,要定义类,我必须执行以下操作(例如) 问题 我需要做到以下几点 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\u类与关键字类类似

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

问题 我需要做到以下几点

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\u类与关键字

类似于几乎所有编程语言,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
有关详细说明,请参阅本页:

它有大量有用的脚本来解释ruby元编程(西班牙语)以及如何实现您想要的功能,还提供了 负责该页面的人员,因此您可以随时向他们发送电子邮件(假设您是该班的学生)出于学术原因


干杯

改变一种语言的关键词几乎从来都不是做任何你想做的事情的最佳方式。为什么要为类创建别名?你的最终目标是什么?这可能是一个无法任意重新定义语法的示例。您的用例是什么?为什么您需要
的替代品?
Class.new
在创建任意类时是否没有给您足够的控制权?哈姆斯,我不想简单地更改关键字“Class”,我想用类似于“Class”的东西扩展de Ruby语言我只是想利用ruby提供的元模型和开放类的概念。如果你对语言设计感兴趣,并且正是因为ruby强大的元编程功能而使用ruby,我认为这是一个相关的问题。事实上,我有一个类似的用例,我想定义一个新的语言特性,类似于类,但不完全相同,我想重新定义/扩展给定的语法。是的!这就是我需要的!它工作得很好。感谢Jörg W MittagI假设
const_missing
类似于
method_missing
,并允许您捕获当前未定义的常量名称
Foo
,以便在该时刻定义它?
case_class Foo do
...
end