【问题标题】:How to use the Scala import clause to import from a method parameter如何使用 Scala 导入子句从方法参数导入
【发布时间】:2025-12-27 23:00:12
【问题描述】:

我编写了一个名为 Vegetables.scala 的 Scala 源文件。我试图从下面的代码中完成的是了解导入子句的工作原理。我在 Eclipse 中输入了这个程序并启动了基于 Eclipse 的 REPL。 我想做的是创建一个名为 Spinach 的新对象,它扩展了蔬菜,将其分配给一个 val 并最终调用对象蔬菜的 showColor 方法,将菠菜对象传递给它。我知道这些例子听起来很荒谬,但我现在只是试图理解 Scala 的概念/机制。为此,我在 REPL 中做了以下操作:

所以这就是我在 REPL 上所做的并得到一个错误。

import com.att.scala.Vegetables._
import java.awt.Color
val obj = object Spinach extends Vegetable { val name = "Spinach" val color = Color.GREEN }

<console>:1: error: illegal start of simple expression
       val obj = object Spinach extends Vegetable { val name = "Spinach" val color = Color.GREEN }
                 ^

Vegetable.scala 的代码如下:

 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 
 }
val veggiePlatter = List(Asparagus, Carrot)

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

什么可以解释这个错误?首先,我试图了解在 REPL 上创建对象然后将其分配给 val 的正确方法是什么。一旦解决了问题,我希望将该 val 传递给参数。然后,我想测试 showColor 中的 import 子句,看看它是否确实导入了 veggie 参数的成员。

【问题讨论】:

    标签: scala object traits


    【解决方案1】:

    定义一个对象就像定义一个静态成员或一个类。您不能同时声明它并将其分配给变量。 (实际上你并不需要,因为对象在定义后就可以通过其名称访问。)

    因此,您的示例将在 REPL 中作为:

    import com.att.scala.Vegetables._
    import java.awt.Color
    object Spinach extends Vegetable { val name = "Spinach" val color = Color.GREEN }
    

    这将定义一个名为Spinach 的对象。之后,您可以拨打Vegetables.showColor(Spinach) 来实现您的初始目标。

    如果你真的想将它分配给一个变量,你可以在声明对象之后调用val obj = Spinach,这将是有效的(虽然不是特别有用 - Spinach 已经是那个东西的明确名称, obj 实际上只是一个别名。)。在您声明对象的同一行上执行此操作是非法的语法。

    【讨论】:

    • val s = Seq - 您可以将单例对象分配给变量。
    • 这是我不知道的重要事实。感谢您对将 Spinach 分配给变量的更新
    • 说你不能将它分配给一个变量是误导。只是说你不能同时声明它并分配给一个变量。