読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

なんとなくのunapply

Scala

例によってゆるよろさんのアレを、ちょっと改造する。

「unapplyって結局どういうことなの」感があったので、違う名前で同じ働きをするメソッドを用意して、動きの違いを見てみる。

import java.util.{Date,Calendar}

object DateOf {

  // 抽出メソッド
  // java.util.Date型のオブジェクトの構造を年月日に分解する
  def unapply( d:Date ):Option[(Long,Long,Long)] = {
    val c = Calendar.getInstance
    c.setTime( d )
    Some(( c.get( Calendar.YEAR ), c.get( Calendar.MONTH ) + 1,
           c.get( Calendar.DAY_OF_MONTH ) ))
  }
}

object FakeDateOf {
  // 似非抽出メソッド
  def myUnapply( d:Date ):Option[(Long,Long,Long)] = {
    val c = Calendar.getInstance
    c.setTime( d )
    Some(( c.get( Calendar.YEAR ), c.get( Calendar.MONTH ) + 1,
      c.get( Calendar.DAY_OF_MONTH ) ))
  }
}


val DateOf( y,m,d ) = new Date
// 抽出メソッドなので、後で使える
println(y + m + d)
// 似非抽出メソッドはとりあえず使える
println(FakeDateOf.myUnapply(new Date))
// でもDateOfと同じようには使えない
// error: object FakeDateOf is not a case class, nor does it have an unapply/unapplySeq member
// val FakeDateOf( fy,fm,fd ) = new Date

はい。

yuroyoro.hatenablog.com