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
,