Quay lại khi phản chiếu vẫn còn tồn tại, vào những ngày của mốc Scala 2.10.0, tôi asked a question về cách tôi có thể sử dụng nó để xem các cây đoạn mã từ REPL. Câu trả lời xuất sắc đi xa hơn tôi hỏi, và cho thấy cách chúng có thể được sử dụng để phân tích và đánh giá cây, vì vậy tôi đã tiếp tục và cố gắng sử dụng nó trên một dự án nhỏ mà tôi đã thực hiện ngày hôm nay.Làm cách nào để có được Hộp công cụ Scala để xem định nghĩa REPL?
Thật không may, mã phân tích và đánh giá như vậy dường như không nhìn thấy bất kỳ định nghĩa REPL:
scala> val x = 1
x: Int = 1
scala> import scala.tools.reflect.ToolBox
import scala.tools.reflect.ToolBox
scala> val tb = scala.reflect.runtime.universe.runtimeMirror(
getClass.getClassLoader).mkToolBox()
tb: scala.tools.reflect.ToolBox[reflect.runtime.universe.type] = ...
scala> tb.eval(tb.parse("x"))
scala.tools.reflect.ToolBoxError: reflective compilation has failed:
not found: value x
Có cách nào để làm cho nó nhận ra định nghĩa được thực hiện trên REPL?
Trái ngược với không có trong REPL? Tôi đã viết chính xác cùng một mã (https://gist.github.com/jedesah/5812481) trong một dự án sbt và tôi nhận được hành vi tương tự như trong REPL. Nếu đây là cách ToolBox hoạt động trong một số bối cảnh khác, tôi rất tò mò muốn biết. – jedesah
@UndercoverAgent Code trong hộp công cụ có quyền truy cập vào bất kỳ thứ gì bạn có thể truy cập từ "root" - nếu không nó sẽ khá vô ích. Trong trường hợp bạn đã cho thấy, biến đó không có sẵn ở "root". –
Vô dụng là một từ mạnh mẽ, nó có thể được sử dụng để đánh giá các cây tự chứa. Trong mọi trường hợp, dự án nhỏ này bạn đang/đang làm việc, nó có phải là nguồn mở không? Tôi rất thích nhìn thấy một ví dụ về việc truy cập các định nghĩa bên ngoài (từ chính cây), tôi không chắc chắn chính xác những gì bạn muốn nói bằng cách tiếp cận chúng từ "gốc". – jedesah