【问题标题】:Static imports inside scala REPLscala REPL 中的静态导入
【发布时间】:2016-05-13 21:06:08
【问题描述】:

给定以下对象:

scala> object P2pClient {
     |   type Num = Double
     |   type Weights = Array[Array[Num]]
     | }
defined object P2pClient

以及以下导入:

import P2pClient._

Weights 类型 似乎 可以正确理解:

val w: Weights = new Weights(3)
w: P2pClient.Weights = Array(null, null, null)

但是为什么它在以下构造中工作:

case class SendWeightsReq(W: Weights) extends P2pReq[Weights] {
     |   override def value() = W
     | }
<console>:12: error: not found: type Weights
       case class SendWeightsReq(W: Weights) extends P2pReq[Weights] {
                                                            ^
<console>:12: error: not found: type Weights
       case class SendWeightsReq(W: Weights) extends P2pReq[Weights] {
                                    ^

对这里发生的事情有什么想法(/workaround)?

更新 REPL 中的通配符导入似乎有很大的限制。这是另一个更简单的例子:

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> trait TT {  def x[T <: java.io.Serializable : TypeTag]: T }
<console>:10: error: not found: type TypeTag
       trait TT {  def x[T <: java.io.Serializable : TypeTag]: T }
                                                     ^

所以我们看到通配符导入没有起作用。这是显式包的相同代码:

scala> trait TT {  def x[T <: java.io.Serializable : reflect.runtime.universe.TypeTag]: T }
defined trait TT

【问题讨论】:

  • 使用尾随 // show 打印编译的内容,包括导入。注意斜线和显示之间的空格。
  • @som-snytt 遇到了麻烦。正如您提到的,我将// show 放在上面的代码之后。当执行:paste 然后ctrl-D 时,REPL 会自动放置:quit - 终止会话。

标签: scala read-eval-print-loop


【解决方案1】:

我发现问题是由于我使用了 Spark REPL spark-shell。这个问题在普通的 Scala REPL 中没有发生。

【讨论】:

【解决方案2】:

好消息:您的代码有效!坏消息:我不知道为什么它不适合你。

这是我的 REPL 会话;我打算建立你的例子,看看什么坏了,但什么也没做。

scala> object P2pClient { type Num = Int; type Weights = Array[Array[Num]] }
defined object P2pClient

scala> import P2pClient._
import P2pClient._

scala> val x = new Weights(3)
x: Array[Array[P2pClient.Num]] = Array(null, null, null)

scala> case class SendWeights(W: Weights)
defined class SendWeights

scala> val s = new SendWeights(new Weights(3))
s: SendWeights = SendWeights([[I@1cab0bfb)

嗯。简单的例子有效。

scala> case class SendWeights2(w: Weights) { def dubs = w }
defined class SendWeights2

当它有身体时工作。

scala> trait P2pReq[+T] { def value(): Unit }
defined trait P2pReq

scala> case class SendWeights3(W: Weights) extends P2pReq[Weights] {
override def value() = W }
defined class SendWeights3

scala> val foo = new SendWeights3(new Weights(3))
foo: SendWeights3 = SendWeights3([[I@51dcb805)
res2: P2pClient.Weights = Array(null, null, null)

Aaaaand 在扩展多态特征并覆盖其成员之一时起作用。唯一可能不同的是您对P2pReq 的定义,但我不明白这会如何导致解释器无法识别您的一种类型。

【讨论】:

  • 嗯。好吧,我会赞成你的回答(这很有帮助),但推迟授予 - 看看是否有其他人经历过我的情况 - 或者了解可能有什么不同。
  • 我添加了自己的答案 - 它发生在 Spark repl 中,而不仅仅是 scala repl。但我会奖励你指出正确的方向。
  • 我很感激,我很高兴我能提供帮助,但我认为你应该接受你自己的答案,因为它是正确的!
  • 好的——我认为你是对的。但不想让你失望。无论如何,我不能再接受我自己的答案两天。所以现在享受它;)无论如何,你的回答确实帮助我找到了解决方案 - 所以投票是完全有道理的。
猜你喜欢
  • 2015-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 2020-05-05
相关资源
最近更新 更多