1

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

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

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

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

当然,当我输入 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")
   }

}
4

1 回答 1

0

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

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

我忘记考虑到之前我已经使用以下语句导入了对象蔬菜:import com.att.scala.Vegetable。

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

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

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

       **Asparagus.name**

REPL 立即返回以下响应:

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

这是我的预期结果。

于 2012-08-27T19:25:13.830 回答