В Scala 3: почему сопоставление шаблонов во время выполнения не может надежно работать с утиным типом с использованием отражения JVM?

Рассмотрим следующий пример:

object MatchDuckType {

  trait Sup
  class Sub1() extends Sup {
    def v1: String = "a"
  }

  def example(v: Any) = {

    v match {

      case _: Sup { def v1: String } => println(1)
      case _ => println(2)
    }
  }

  def main(args: Array[String]): Unit = {
    example(Sub1())
    example(1)
  }
}

Компилятор выдал следующую ошибку:

MatchDuckType.scala:16:12: the type test for xxx.MatchDuckType.Sup{v1: String} cannot be checked at runtime

Это утверждение явно неверно, так как Sup { def v1: String } можно легко проверить с помощью отражения во время выполнения Java (сначала получив класс термина, а затем получив сигнатуры его методов). Почему предупреждение все еще существует? Это ошибка в компиляторе?

Я чувствую, что Scala 3 нуждается в более систематическом подходе к сопоставлению с образцом, самый простой способ сделать это, вероятно, объяснить его эквивалентную форму без сахара как часть предупреждающего сообщения.

tribbloid 13.02.2023 21:49

Вы можете включить -Xprint:typer или -Xprint:jvm в Scala 2 или -Xprint:typer или -Xprint:genBCode в Scala 3.

Dmytro Mitin 14.02.2023 07:52
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

То, что это не работает, — это не просто «ошибка»; включение такой вещи в язык потребовало бы серьезной работы по проектированию, спецификации и реализации.

Функция, на которую вы надеялись, не существует ни в Scala 2, ни в Scala 3.

Я нашел запрос на эту функцию, датированный 2007 годом (!), но он никогда не привлекал особого внимания: https://github.com/scala/bug/issues/329

Даже если бы эта функция существовала, она была бы специфичной для платформы и ограниченной по объему: она работала бы только на JVM, а не на JS или Native, и работала бы только для подмножества типов уточнения, которые могут быть достоверно представлены. в байткоде. Это упускает из виду большую часть системы типов Scala.

(По крайней мере, без TypeTag, но TypeTag предназначен только для Scala 2; запрос функции на сопоставление на основе TypeTag: https://github.com/scala/bug/issues/6517. В контексте Scala 3 рассмотрите возможность попытки вместо этого использовать типы соответствия?)

Что касается вашего замечания о дешугаринге, шаблон сопоставляет desugar с isInstanceOf, и поведение isInstanceOf такое же, так что речь идет не о сопоставлении с образцом как таковом, а о тестах типов.

Хорошо, что после внедрения JS или Native отражение становится скорее минным полем, на которое нельзя полагаться. Мне нравится идея совмещения Typeable/TypeTag в байт-коде. Мне просто не нравится вызывать их определение в коде вручную :) Поскольку стирание типов происходит во многих языках. Было бы интересно увидеть исследования в области проверки среды выполнения "постепенно/по запросу".

tribbloid 14.02.2023 22:51

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