В scala существует ли method_missing?

подобный тому в Ruby

5
задан Jija 23 June 2010 в 21:11
поделиться

3 ответа

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

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


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

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

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

9
ответ дан 18 December 2019 в 05:54
поделиться

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

1
ответ дан 18 December 2019 в 05:54
поделиться

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

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

6
ответ дан 18 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: