Как определить мой собственный логический оператор на Booleans в Scala - PullRequest
1 голос
/ 21 июня 2020

Я хотел бы иметь новый логический оператор. Однако, когда я пытаюсь определить его как:

def xor (that: Boolean): Boolean = (this || that) && !(this && that)

, а затем использую его, я получаю следующую ошибку:

значение xor не является членом of Boolean

Определение xor находится в том же классе непосредственно перед функцией, которую я использую.

Какое правильное место, где находится оператор определение надо поставить?

1 Ответ

2 голосов
/ 21 июня 2020

Я не уверен, знаете ли вы об этом, но в Scala (^) уже есть побитовый оператор XOR, который вы, вероятно, предпочли бы.

Чтобы добавить методы расширения в booleans, вы не можете просто определить функцию, которая принимает 2 параметра. Вам нужно будет обернуть логическое значение в неявный класс и определить для него правильный метод.

implicit class Xorable(private val a: Boolean) extends AnyVal {
  def xor(b: Boolean) = a ^ b
}

и только тогда вы сможете использовать его как true xor false. Метод, который вы определили выше, может использоваться только как xor(a, b)

Изменить: как указал Луис Мигель Мехиа Суарес

Обычно рекомендуется создавать неявные классы быть классами значений.

Единственное, что у вас не может быть неявного класса значений, параметр которого является экземпляром другого класса значений. Поскольку Boolean являются классами значений, вам придется либо не использовать классы значений, либо делать неявное определение в этом случае, но для потомков AnyRef вы можете просто добавить extends AnyVal к этому первому неявному классу . Фактически -

Ограничение применяется только к определяемым пользователем классам значений, вы можете сделать неявный класс логических значений классом значений

Кстати, вы можете просто сделать это в Dotty, насколько я знаю:

def (a: Boolean) xor (b: Boolean) = a ^ b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...