Следующее больше не является строго верным с 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 :-)
Нет, это невозможно в Scala 2.8 и более ранних версиях.
Не совсем. Это не имеет смысла. Scala - статически типизированный язык, в котором методы связываются во время компиляции; Ruby - динамически типизированный язык, в котором сообщения передаются объектам, и эти сообщения оцениваются во время выполнения, что позволяет Ruby обрабатывать сообщения, на которые он не отвечает напрямую, а-ля method_missing
.
Вы можете имитировать method_missing
несколькими способами в Scala, в частности, используя библиотеку Actors, но это не совсем то же самое (или почти так же просто), как method_missing
в Ruby.