scala.tools.nsc.Interpreter - Как выполнить операторы интерпретатора, чтобы результаты были определены в глобальной области видимости? (Scala 2.7.7финал) - PullRequest
7 голосов
/ 18 марта 2011

Я экспериментирую с интерпретацией строк в Scala для определения классов и методов.Я использовал пример из http://scala -programming-language.1934581.n4.nabble.com / Compiling-a-Scala-Snippet-at-run-time-td2000704.html в следующем коде:

import scala.tools.nsc.{Interpreter,Settings}
var i = new Interpreter(new Settings(str => println(str)))
i.interpret("class Test { def hello = \"Hello World\"}")

Это работает, но каким-то образом результаты интерпретации не происходят в глобальном пространстве имен:

new Test # => <console>:5: error: not found: type Test

Следовательно : Как выполнить операторы интерпретатора, чтобы результатыопределены в глобальном масштабе?В настоящее время я использую scala2.7.7final и не могу изменить переводчик на 2.8.

Спасибо за вашу помощь

Matthias

Ответы [ 2 ]

6 голосов
/ 18 марта 2011

Я думаю, что когда вы переходите от интерпретатора к работающему приложению, вы не уклоняетесь от использования отражения:

scala> var res = Array[AnyRef](null)
scala> i.bind("result", "Array[AnyRef]", res)
scala> i.interpret("result(0) = new Test")
scala> res
res11: Array[AnyRef] = Array(Test@2a871dcc)

Вы все еще можете взять объект класса и создать экземпляр себя:

scala> i.interpret("result(0) = classOf[Test]")                            
scala> res(0).asInstanceOf[Class[_]].getConstructors()(0).newInstance()
res24: Any = Test@28bc917c
1 голос
/ 18 марта 2011

Вы не можете, потому что Scala не может знать статически, во время компиляции, что класс Test будет создан во время вызова.

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