【问题标题】:Is it possible to define companion classes/modules in the Scala interpreter?是否可以在 Scala 解释器中定义伴随类/模块?
【发布时间】:2010-08-23 21:50:04
【问题描述】:

在 Scala 解释器中进行测试通常很方便。但是,我遇到的一个问题是我必须重构使用隐式转换的代码,因为定义与现有类同名的对象不会使其成为 REPL 中的配套模块。因此,当我翻译回“真实源代码”时,我无法确信我的代码仍然可以工作。

有没有办法在 REPL 中定义同伴?也许类似于

bigblock {
   class A

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

这样

val v: A = "apple"

将编译。

【问题讨论】:

    标签: scala


    【解决方案1】:

    差不多了:

    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 的第二个定义掩盖了第一个。)

    【讨论】:

    • 谢谢!作为记录,一旦你完成了import ABlock._(使用封闭对象),import ABlock.A.strToA 就没有必要了。
    【解决方案2】:

    对于更新的版本,可以使用 :paste 命令。

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 2017-03-13
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多