4

次のコードがコンパイルに合格できない理由を誰かが知っていますか?なぜ型の不一致が発生するのかわかりません。

出力は次のようになります。

List(Book, DVD, MP3)

私のコード:

package library3 {

  abstract class Item() {
    def use(): Unit
  }

  // match on Items.

  case class Book (val title: String) extends Item
  case class DVD (val title: String) extends Item
  case class MP3 (val title: String) extends Item
}

object Ch3_2 {

  import library3._

  def main( args:Array[String] ) = {
    val items = List( new Book( "The Hobbit" ),
              new DVD( "Black Adder Goes Forth" ),
              new MP3( "Watership Down" )
            )

    println( classifyItems( items ) )
  }

  def classifyItems( items:List[Item] ): List[String] = {

    // Use a for comprehension and pattern matching to take a list of
    // items and return a list of types of items.

    for (item <- items) { // <=== type mismatch;
        item match {
            case b: Book => println("Book")
            case d: DVD => println("DVD")
            case m: MP3 => println("MP3")
        }
    }

  }

}

エラーメッセージ:

error: type mismatch;
found   : Unit
 required: List[String]
    for (item <- items) {
              ^
one error found
4

1 に答える 1

3

コードの作業バージョンは次のとおりです。

abstract class Item

case class Book (title: String) extends Item
case class DVD (title: String) extends Item
case class MP3 (title: String) extends Item

val items = List( 
  Book( "The Hobbit" ),
  DVD( "Black Adder Goes Forth" ),
  MP3( "Watership Down" )
)

def classifyItems(items:List[Item]): List[String] = 
  for (item <- items) yield
    item match {
      case b: Book => "Book"
      case d: DVD => "DVD"
      case m: MP3 => "MP3"
      case _ => "else"
    }

実際に動作することの確認:

scala> classifyItems(items)
res2: List[String] = List(Book, DVD, MP3)    

いくつかのコメント:

  • ケースクラスを使用する場合、使用する必要はありませんnew
  • yieldステートメントの後にステートメントを使用する必要がありますfor
  • でデフォルトのケースを使用したくない場合は、またはmatchを使用する必要があります。sealed traitsealed class
  • forScala でのステートメントの詳細: http://www.scala-lang.org/node/111
于 2012-10-06T17:00:28.387 に答える