在Ruby中重新定义“class”关键字

时间:2017-04-07 01:25:27

标签: ruby class syntax

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

var example1 = "some_information";

$.ajax({
  url: '/myURL?var1=example1',
  type: 'POST',
  data: JSON.stringify(data),
  contentType: 'application/json; charset=utf-8'
})

问题

我需要实现以下

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

我需要ruby解释器来处理 case_class ,方法与关键字 class

相同

2 个答案:

答案 0 :(得分:3)

与几乎所有编程语言一样,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

答案 1 :(得分:1)

为了达到这个目的,除了定义上一个答案中已经说过的内容之外:

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元编程(西班牙语)以及如何实现您正在寻找的东西,它也有相关的参考资料。 负责该页面的人员,因此您可以随时向他们发送电子邮件(鉴于您是该班级的学生) 出于学术原因

干杯!