Определение нового логического оператора в 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 }
Другие вопросы по тегам