这可能只是一种想象,但通过一些巧妙的元编程技巧,能否在Ruby中定义一个新的逻辑运算符呢?我想定义一个 but
运算符。
例如,如果我想在x
为true但不为y
时执行某些操作,我必须编写类似以下的代码:
if x and not y
但是我想要写作
if x but not y
它应该和
and
完全一样,但是程序员需要明智地使用它来增强代码的可读性。这可能只是一种想象,但通过一些巧妙的元编程技巧,能否在Ruby中定义一个新的逻辑运算符呢?我想定义一个 but
运算符。
例如,如果我想在x
为true但不为y
时执行某些操作,我必须编写类似以下的代码:
if x and not y
但是我想要写作
if x but not y
and
完全一样,但是程序员需要明智地使用它来增强代码的可读性。如果不编辑Ruby解析器和源代码并编译新版本的Ruby,你是无法做到的。如果你愿意,你可以使用这种丑陋的语法:
class Object
def but(other)
self and other
end
end
x.but (not y)
x
和y
(无短路),并且会按照相反的顺序(先y
再x
)进行评估。 - Marc-André Lafortune&&
和||
的原因(而覆盖&
和|
是可以的)。 - Mladen Jablanovića.OP{b}
而不是a.OP(b)
,然后重写它们就完全没问题了。几年前,我重新实现了所有Ruby的布尔运算符作为消息发送,并且使用了RubySpec
测试套件来验证它们的正确行为:https://GitHub.Com/JoergWMittag/B001e/顺便说一句:请关注该代码的*实际*语义...这是我编写的第一个Ruby项目,代码*非常糟糕* :-) - Jörg W Mittag如果你真的想做这个,尝试编辑parse.y并重新编译Ruby。那里定义了Ruby的语法。
正如其他人已经指出的那样,您无法在Ruby中定义自己的运算符。运算符集是预定义和固定的。您能做的就是通过响应适当的消息来影响一些现有运算符(即被转换为消息发送的运算符)的语义。
但是,当然,您可以很容易地实现一个but
方法:
class Object
def but
self && yield
end
end
Object.new.but { not true }
x
的逻辑值!=y
的逻辑值。 - Russellunless x but y
- 尽管它仍然有点垃圾。它基本上很适合我在问题中描述的用例,但不适用于其他情况 - 这就是为什么它只是一个空想! - Russellunless not x and not !y
。 - Russell