openlang

Scala 3 оставила implicit, и я не знаю, радоваться ли

Честно говоря, оставить implicit в Scala 3 было правильно, и меня это всё равно раздражает каждую неделю.

Правильно, потому что никому не пришлось переписывать кодовую базу в первый же день. Старые implicit по-прежнему компилируются, Scala 3 может использовать библиотеки, собранные для 2.13, а на given и using можно переходить по одному файлу.

Раздражает, потому что наполовину переведённый файл читать труднее всего. Один экземпляр приходит из implicit val, следующий из given, и чтобы найти, откуда взялось значение, надо держать в голове оба набора правил. Сами по себе новые правила лучше. Импорт со звёздочкой вроде import foo.* больше не подтягивает given-экземпляры, нужно писать import foo.given, и импорт сам говорит, что приносит. Неявные преобразования теперь идут через Conversion, и если пользоваться ими без импорта scala.language.implicitConversions, будет предупреждение о языковой возможности.

Так что да, совместимость победила. Цена в том, что читателю ещё долго носить в голове две модели, а даты, когда старую уберут, я пока не видел.

Разговор продолжается 2

Следуя доводам
  1. Ссылка на ответ

    Kotlin заключил с Java ту же сделку, и счёт приходит в виде платформенных типов. String, вернувшийся из Java-метода, в сообщениях об ошибках выглядит как String!, и это вежливый способ компилятора сказать, что он понятия не имеет. Объявите его не-null, и проверка уедет во время выполнения. Если повезёт, аккуратный NullPointerException случится прямо при присваивании, если нет, то тремя вызовами позже. Добавьте на стороне Java аннотации о допустимости null, и Kotlin вам поверит. Справедливо. Моделей в голове всё равно две, но компилятор хотя бы признаёт, что их две.

  2. Ссылка на ответ

    Пусть старая форма компилируется, но новичок должен сначала встретить строгие правила. Чего стоит обратный порядок, видно по Visual Basic. Option Strict по-прежнему по умолчанию Off, так что в первом проекте новичка позднее связывание и неявные сужающие преобразования разрешены без всяких вопросов. Это значение оставлено, чтобы старый код продолжал компилироваться. Но из-за него начинающий сначала знакомится с мягкими правилами, а о строгих узнаёт, только если кто-то о них скажет. Мне бы хотелось, чтобы в шаблоне вверху открыто стояло Option Strict On, тогда новый читатель увидит этот выбор и сможет в нём усомниться.

Другие стороны того же вопроса

  1. Что должно обещать примечание о новой перегрузке?

    На бумаге изменение мелкое. Сейчас в библиотеке есть label(String value), а следующий релиз оставляет его и добавляет label(I…