【问题标题】:Trying to get Scala imports with hiding clause and catch-all尝试使用隐藏子句和包罗万象的 Scala 导入
【发布时间】:2012-08-27 17:11:59
【问题描述】:

好的,所以我编写了以下 Scala 代码来探索 Scala 导入。我的目标是导入除芦笋外的所有对象蔬菜成员。我了解这样做的方法是编写以下子句(在执行 com.att.scala.Vegetables 之后)

  **import Vegetables.{Asparagus=>_,_}**

由于我的目的是确认上述条款的意图,我开始要求 REPL 返回 Asparagus.name。在我看来,我希望 REPL 会说类似的话 “嘿,你让我不要用你的重命名条款导入芦笋,所以我没有芦笋可以给你”

相反,REPL 返回 res5: java.lang.String = 芦笋

当然,当我输入 JapaneseSpinach.color 时,它会按预期工作并返回 res7: java.awt.Color = java.awt.Color[r=0,g=255,b=0]

对我来说很明显,我在这里遗漏了一些东西。我的目标是了解隐藏子句的工作方式并确认隐藏子句确实隐藏了一个成员(在我看来隐藏意味着该成员实际上不可用..)

我的代码如下:

   package com.att.scala

   import java.awt.Color
   trait Vegetable {
     val name: String
    val color: Color
  }

 object Vegetables {
  object Asparagus extends Vegetable { 
    val name = "Asparagus"
    val color = Color.GREEN  
  } 

object Carrot extends Vegetable { 
   val name = "Carrot"
   val color = Color.ORANGE 
}

object Parsnip extends Vegetable { 
  val name = "Parsnip"
  val color = Color.ORANGE
}

object JapaneseSpinach {
  val name = "Komatsuna"
  val color = Color.GREEN
 }
 val veggiePlatter = List(Asparagus, Carrot)

def showColor(veggie: Vegetable) {
  println("Entered showColor")
  import veggie._
  println("Veggie name is " + name)
}

   def test() {
     println("entered test")
   }

}

【问题讨论】:

  • 我不确定,但import Vegetables.{Asparagus=>,},IMO 是非法语法。你应该写import Vegetables.{Asparagus => _, _}
  • 我的错。这是一个无意的、粗心的错误,但感谢您指出。但我确实有:进口蔬菜。 {芦笋=>_,_}

标签: scala import


【解决方案1】:

首先还要感谢 om-nom-nom。 早些时候我使用了如下的 import 子句: 进口蔬菜。{Asparagus=>,} 而不是 REPL 说类似“嘿,你让我不要用你的重命名条款导入 Asparagus,所以我没有 Asparagus 可以给你” 它仍然返回 Asparagus.name 和 Asparagus.color。 (当我输入“import Asparagus.name”作为测试时)

这时我意识到我错过了一些东西。结果是反直觉的。芦笋应该是不可见的。仔细一看,我发现我犯了以下错误:

我忘记了之前我已经使用以下语句导入对象蔬菜这一事实: 导入 com.att.scala.Vegetable。

上述语句必须将蔬菜的所有成员纳入范围。 后来我应用了重命名和包罗万象的条款,但由于第一次导入,它不起作用。所以我决定再试一次。

我重新启动了 Eclipse,启动了 Eclipse 并发出了以下命令: 这次我是这样做的:

     **import com.att.scala.Vegetables.{Asparagus=>_,_}**

       **Asparagus.name**

REPL 立即返回以下响应:

         **<console>:11: error: not found: value Asparagus
          Asparagus.name
          ^**

这是我的预期结果。

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 2011-07-23
    • 2011-02-12
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多