Определение нового логического оператора в Ruby
Это настоящий сон, но возможно ли с помощью какого-то хитрого метапрограммирующего трюка определить новый логический оператор в Ruby? Я хотел бы определить but
оператор.
Например, если я хочу что-то сделать, если x
но нет y
это правда, я должен написать что-то вроде:
if x and not y
Но я хотел бы написать
if x but not y
Он должен работать точно так же, как and
но программисту следует разумно использовать его, чтобы повысить удобочитаемость кода.
3 ответа
Без редактирования парсера и исходных текстов Ruby и компиляции новой версии Ruby вы не сможете. Если вы хотите, вы можете использовать этот уродливый синтаксис:
class Object
def but(other)
self and other
end
end
x.but (not y)
Обратите внимание, что вы не можете удалить скобки или пробел в этом фрагменте. Это также будет скрывать функциональность кода кому-то, кто читает ваш код. Не делай этого.
Если вы действительно хотите это сделать, попробуйте отредактировать parse.y и перекомпилировать Ruby. Вот где определяется синтаксис Ruby.
Как уже отмечали другие, вы не можете определить свои собственные операторы в Ruby. Набор операторов предопределен и фиксирован. Все, что вы можете сделать, это повлиять на семантику некоторых существующих операторов (а именно тех, которые преобразуются в отправку сообщений), отвечая на соответствующие сообщения.
Но, конечно, вы можете реализовать but
метод довольно легко:
class Object
def but
self && yield
end
end
Object.new.but { not true }