在Ruby中定义新的逻辑运算符

在Ruby中定义新的逻辑运算符,ruby,metaprogramming,Ruby,Metaprogramming,这是一个无聊的白日梦,但是有没有可能用一些简洁的元编程技巧在Ruby中定义一个新的逻辑运算符呢?我想定义一个但是操作符 例如,如果我想做某件事,如果x而不是y是真的,那么我必须编写如下内容: if x and not y 但是我想写 if x but not y 它的工作原理应该与和完全相同,但需要程序员明智地使用它来提高代码的易读性 如果不编辑Ruby解析器和源代码并编译Ruby的新版本,您就不能。如果需要,可以使用以下难看的语法: class Object def but(other

这是一个无聊的白日梦,但是有没有可能用一些简洁的元编程技巧在Ruby中定义一个新的逻辑运算符呢?我想定义一个
但是
操作符

例如,如果我想做某件事,如果
x
而不是
y
是真的,那么我必须编写如下内容:

if x and not y
但是我想写

if x but not y

它的工作原理应该与
完全相同,但需要程序员明智地使用它来提高代码的易读性

如果不编辑Ruby解析器和源代码并编译Ruby的新版本,您就不能。如果需要,可以使用以下难看的语法:

class Object
  def but(other)
    self and other
  end
end

x.but (not y)

请注意,不能删除此代码段中的括号或空格。它还会将代码的功能隐藏到其他阅读您的代码的人身上。不要这样做。

正如其他人已经指出的那样,您不能在Ruby中定义自己的运算符。操作符集是预定义和固定的。您所能做的就是通过响应适当的消息来影响一些现有操作符(即转换为消息发送的操作符)的语义

当然,您可以非常轻松地实现
但是
方法:

class Object
  def but
    self && yield
  end
end

Object.new.but { not true }

如果您确实想这样做,请尝试编辑parse.y并重新编译Ruby。这就是Ruby语法的定义。

没有语法分析器的更改。在没有
的情况下,结构的语义不清楚。你能举个例子说明为什么你认为语义不清楚吗?它的工作原理与
完全相同。唯一的区别是,这意味着
x
的逻辑值为!=
y
的逻辑值。如果x但y
是什么意思?这不是一个技术问题,这是一个“Dave不认为这很清楚”的问题——纯粹是优先考虑的问题。这将是一个糟糕的程序员滥用构造的例子。也许稍微好一点的应该是
,除非是x,但y
——尽管这还是有点垃圾。它基本上与我在问题中描述的用例非常吻合,但其他的就不多了——这就是为什么它是一个无聊的白日梦!我的意思是,滥用现有结构同样容易:
,除非不是x和not!例如,y
。更重要的是,这个“解决方案”将始终计算
x
y
(无短路),并将以相反的顺序进行计算(
y
然后
x
)。@Marc AndréLafortune,这可能就是重写
&
的原因(当覆盖
&
|
is时)。@MladenJablanović:你只需要定义一组操作符(让我们称它们为惰性操作符),它们被转换为
a.OP{b}
,而不是
a.OP(b)几年前,我重新实现了Ruby的所有布尔运算符作为消息发送,我甚至使用了
RubySpec
testsuite来验证它们的正确行为:顺便说一句:请关注代码的实际语义……这是我写的第一个Ruby项目,并且他代码很糟糕:-)我同意。这个答案最好的部分是不要这样做+1为什么我会说它不适合任何实际应用,我认为用户可以从尝试中学到一些东西。