0

Vegetables.scalaというScalaソースファイルを作成しました。以下のこのコードから私が達成しようとしているのは、インポート句がどのように機能するかを理解することです。このプログラムをEclipseで入力し、EclipseベースのREPLを開始しました。私がやりたいのは、Vegetableを拡張するSpinachという新しいオブジェクトを作成し、それをvalに割り当て、最終的にオブジェクトVegetableのshowColorメソッドを呼び出して、Spinachオブジェクトを渡します。例がばかげているように聞こえることは知っていますが、私は今、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パラメーターのメンバーが実際にインポートされるかどうかを確認します。

4

1 に答える 1

3

オブジェクトの定義は、静的メンバーまたはクラスの定義に似ています。宣言すると同時に変数に割り当てることはできません。(実際には、オブジェクトは定義された後、その名前を介してすでにアクセスできるため、実際にアクセスする必要はありません。)

したがって、あなたの例は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事実上、単なるエイリアスになります)。不正な構文ですが、オブジェクトを宣言するのと同じ行でそれを実行します。

于 2012-08-23T16:27:44.467 に答える