【问题标题】:Ruby redefine "and" keyword in class?Ruby在类中重新定义“and”关键字?
【发布时间】:2013-11-21 15:48:20
【问题描述】:

是否可以在 ruby​​ 中重新定义 and 之类的关键字?我有一些这样的 DSL 代码:

rule condition and another_condition do
  do_something
end

我希望 and 成为我班级中的另一个 ruby​​ 方法,就像 conditionanother_condition 一样。这可能吗?

【问题讨论】:

  • 恕我直言,重新定义 Ruby 关键字是一个非常糟糕的主意...
  • 刚发现不可能。请参阅下面的答案。
  • 要重新定义关键字,您必须更改底层 C 代码并重新编译,之后它会因为您引入的许多错误而崩溃。换句话说,忘记它。

标签: ruby metaprogramming token keyword dsl


【解决方案1】:

andor 这样的关键字不能被重载(覆盖)。

这篇文章解释了运算符重载并指定了哪些运算符不能被覆盖:

http://strugglingwithruby.blogspot.com/2010/04/operator-overloading.html

在文章的最后写道:

You cannot override keywords, such as "or", nor can you override:
&& & || | () {} :: . ~ .. ...

更新

正如 Jörg W Mittag 指出的那样,这是错误的。 andor&&|| 是唯一不能被覆盖的运算符。 not 可以通过 ! 覆盖。

【讨论】:

  • 能否请您从源头复制粘贴相关部分,以便我们在这里找到完整的答案?一旦链接失效(这种情况迟早发生),有相同问题的用户就不会得到完整的答案。
  • 错了。您可以覆盖&|~。您还可以覆盖.()(它被转换为对.call() 的调用)。你也可以覆盖not,或者更准确地说,你可以覆盖!,这也会改变not的行为。 andor&&|| 没有根本原因不能被覆盖,只是不支持。
【解决方案2】:

语言不支持。

但是你总是可以尝试像this one 这样的工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2012-07-09
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多