Переопределить метод equals для строкового класса в пакете в проекте scala

Таким образом, формулировка проблемы такова, как она говорит. Я хочу переопределить поведение equals в строковом классе в определенном пакете.

Я огляделся, и в основном кажется, что нет никакого способа сделать это.

Самое близкое, что я получил к определению метода в существующем классе, было следующим:

implicit class StringImprovements(s: String) {
  def increment = s.map(c => (c + 1).toChar)
}

а затем используйте его так -

"HAL".increment

Что, честно говоря, удивительно. Но затем я попытался переопределить равенство, используя тот же подход, это не сработало. Я осмотрелся и нашел этот вопрос от 2015 года - переопределить библиотечный метод с помощью Scala Implicit

Цитируя строку из вышеупомянутого вопроса -

Implicits are used if scala compiler cannot find method without it, so you can`t override methods with implicits

Но учитывая, что релизы Scala очень часты и все постоянно меняется, мне было интересно, возможно ли это сделать сейчас, с помощью этого или любого другого средства.

Заранее спасибо!

Даже если бы это было возможно, вы могли бы переопределить String#equals только для своего собственного кода (потому что он должен использовать ваш неявный код). Все остальное, что уже скомпилировано против «обычной» строки, не будет затронуто, и результат будет чрезвычайно запутанным, особенно с таким основным методом.

Thilo 27.05.2019 10:37

@Thilo Кажется, мне не следовало использовать слово «везде в моем проекте». Это вводит в заблуждение, извините за путаницу, я отредактировал его на «конкретные пакеты». Итак, в основном «весь мой код»

Anil Kumar 27.05.2019 10:41

Ну, вы не можете этого сделать. Вы должны либо выбрать другое имя метода, либо поместить String в свой собственный тип MySpecialString, на котором вы затем можете определить equalshashCode) по своему вкусу.

Thilo 27.05.2019 10:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет, это невозможно. И если бы это было так, я бы ожидал, что много библиотечного кода сломается, потому что он ожидал нормального поведения от String#equals!

Я не говорю о том, что поведение String equals меняется везде, только в пределах пакетов, которые я указываю, где я должен специально импортировать конкретный неявный класс. Так что код библиотеки никогда не сломается. Верно? Пожалуйста, поправьте меня, если я ошибаюсь

Anil Kumar 27.05.2019 10:35

Кажется, я не должен был использовать слово «везде в моем проекте». Это вводит в заблуждение, извините за путаницу, я отредактировал его на «конкретные пакеты». Итак, в основном «весь мой код»

Anil Kumar 27.05.2019 10:42

Это все равно было бы очень странно. Когда вы используете строки в качестве ключей карты или членов набора, вы ожидаете, что они будут использовать ваше равенство или стандартное? Что делать, если карта возвращается из библиотечного метода? Как говорится в комментарии Тило, имеет смысл вместо этого определить свой отдельный тип (и, возможно, добавить неявные преобразования в и/или из String).

Alexey Romanov 27.05.2019 11:38

Другие вопросы по теме