Есть ли method_missing в Scala?

Похож на тот, что в Ruby

4 ответа

Решение

Следующее уже не совсем верно с Dynamic черта, обнаруженная в [экспериментальной] Scala 2.9. Смотрите ответ от Киптона Барроса, например.

Тем не мение, Dynamic все еще не совсем как method_missing, но вместо этого использует магию компилятора, чтобы эффективно переписывать вызовы методов для "отсутствующих" методов, как определено статически, для прокси (applyDynamic). Именно подход статического определения "отсутствующих" методов отличает его от method_missing с точки зрения полиморфизма: нужно было бы попробовать и динамически продвинуть (например, с помощью отражения) методы, чтобы получить истинное method_missing поведение. (Конечно, этого можно избежать, избегая подтипов:-)


Нет. Такая концепция не существует в Java или Scala.

Как и в Java, все методы в Scala "связаны" во время компиляции (это также определяет, какой метод используется для перегрузки и т. Д.). Если программа выполняет компиляцию, указанный метод существует (или сделал в соответствии с компилятором), в противном случае это не так. Вот почему вы можете получить NoSuchMethodError, если вы измените определение класса, не перестраивая все затронутые классы.

Если вы просто беспокоитесь о попытке вызвать метод объекта, который соответствует сигнатуре ("типизированная типизация утки"), то, возможно, вам удастся обойтись без структурной типизации. Структурная типизация в Scala - это волшебный доступ к отражению - таким образом, он откладывает "связывание" до времени выполнения и может возникнуть ошибка времени выполнения. В отличие от method_missing это не позволяет целевому объекту обработать ошибку, но позволяет вызывающему (и вызывающий может теоретически вызвать определенный метод methodMissing для целевого объекта... но это, вероятно, не лучший способ приблизиться к Scala. Scala это не Ruby:-)

Да, в Scala 2.9 с -Xexperimental вариант, можно использовать Dynamic черта ( скаладок). Классы, которые расширяются Dynamic получить магический метод applyDynamic(methodName, args) который ведет себя как Руби method_missing,

Среди прочего, Dynamic Эта черта может быть полезна для взаимодействия с динамическими языками в JVM.

На самом деле, нет. Это не имеет смысла. Scala - это статически типизированный язык, в котором методы связаны во время компиляции; Ruby - это язык с динамической типизацией, в котором сообщения передаются объектам, и эти сообщения оцениваются во время выполнения, что позволяет Ruby обрабатывать сообщения, на которые он не отвечает напрямую. method_missing,

Вы можете подражать method_missing в некотором смысле в Scala, особенно с использованием библиотеки Actors, но она не совсем такая (или почти не такая простая), как Ruby method_missing,

Нет, это невозможно в Scala 2.8 и более ранних версиях.

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