Можно ли определить сопутствующие классы / модули в интерпретаторе Scala? - PullRequest
4 голосов
/ 24 августа 2010

Часто удобно проверять вещи в интерпретаторе Scala.Однако одна проблема, с которой я сталкиваюсь, заключается в том, что я должен реструктурировать код, который использует неявные преобразования, потому что определение объекта с тем же именем, что и у существующего класса , не делает его компаньоном в REPL.В результате я не могу быть уверен, что мой код все еще будет работать, когда я перевожу обратно в «реальный источник».

Есть ли способ определить компаньонов в REPL?Может быть, что-то вроде

bigblock {
   class A

   object A {
      implicit def strToA(s: String): A = // ... 
   }
}

такое, что

val v: A = "apple"

будет компилироваться.

Ответы [ 2 ]

11 голосов
/ 24 августа 2010

Это близко:

object ABlock {
   class A

   object A {
      implicit def strToA(s: String): A = // ... 
   }
}
import ABlock._

Или следующее, если вы поместите все в одну строку:

class A; object A { implicit def strToA(s: String): A = // ... } }

... хотя в любом случае вам все равно придется импортироватьнеявное преобразование для выполнения следующей работы по вашему запросу:

import ABlock.A.strToA  // for the form with the enclosing object
import A.strToA         // for the one-line form without an enclosing object
val v: A = "apple"

Причина, по которой вам нужно это сделать, заключается в том, что каждая строка, которую вы вводите в REPL, заключена в объект, а каждая последующая вложена внепосредственно предшествующийЭто сделано для того, чтобы вы могли делать что-то вроде следующего, не получая ошибок переопределения:

val a = 5
val a = "five"

(Фактически, второе определение a здесь затеняет первое.)

2 голосов
/ 10 июня 2012

С более поздними версиями можно использовать команду : paste .

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