Есть ли method_missing в Scala? - PullRequest
       0

Есть ли method_missing в Scala?

5 голосов
/ 24 июня 2010

похоже на тот, что в Ruby

Ответы [ 4 ]

12 голосов
/ 26 июня 2011

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

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

9 голосов
/ 24 июня 2010

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

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


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

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

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

6 голосов
/ 24 июня 2010

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

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

в Ruby.
1 голос
/ 24 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...