かとじゅんの技術日誌

技術の話をするところ

Scala始めました

今からでも遅くないということで、私もScalaを始めました。去年ぐらいにも耳に入っていたのですが、なんか小難しい言語だなーと思っていました。まぁ、でも食わず嫌いはよくないということで、まずやってみようと本を何冊かを買い込んで勉強してます。やっていると楽しくなってきたみたいです。

で、ScalaDXOすると、どんな感じかなーってことで、極簡単なサンプル書いてみました。

なんか、Aaa,Bbbのsetter, getterが流儀に反してますよね?xxx, yyyのScala流のgetterとsetterがxxx():String, xxx_=(v:String):Unitが存在するのすが、dxoメソッドにどうやって渡せばよいか、ちょっと分かってません。まだまだ、Scalaの筋肉が足りませんw 先輩方教えてくださいm(_ _)m

class Aaa(var xxx:String, var yyy:String) {
  def getXxx():String = xxx
  def setXxx(value:String): Unit = xxx = value
  def getYyy():String = yyy
  def setYyy(value:String): Unit = yyy = value
}

class Bbb(var xxx:String, var yyy:String) {
  def getXxx() : String = xxx
  def setXxx(value:String) = xxx = value
  def getYyy() : String = yyy
  def setYyy(value:String) = yyy = value
}

object Main {
  // Tは型パラメータ
  def dxo[T](setter:T => Unit, getter:() => T) = setter(getter())
  
  def main(args:Array[String])={
    val aaa = new Aaa("aaa","bbb");
    val bbb = new Bbb("xxx","yyy");
    
    dxo[String](aaa.setXxx, bbb.getXxx)
    dxo[String](aaa.setYyy, bbb.getYyy)

    println(aaa.getXxx) // xxx
    println(aaa.getYyy) // xxx
  }
  
}

追記:こんな感じにしたらいけたっぽい

class Aaa(private var x:String, private var y:String) {
  def xxx():String = x
  def xxx_=(value:String): Unit = x = value
  def yyy():String = y
  def yyy_=(value:String): Unit = y = value
}

class Bbb(private var x:String, private var y:String) {
  def xxx() : String = x
  def xxx_=(value:String) = x = value
  def yyy() : String = y
  def yyy_=(value:String) = y = value
}

object Main {

  def dxo[T](setter:T => Unit, getter:() => T) = setter(getter())
  
  def main(args:Array[String])={
    val aaa = new Aaa("aaa","bbb");
    val bbb = new Bbb("xxx","yyy");

    dxo[String](aaa.xxx_=, bbb.xxx)
    dxo[String](aaa.yyy_=, bbb.yyy)

    println(aaa.xxx) // xxx
    println(aaa.yyy) // yyy
  }
  
}

追記:Scalaな皆さんがやさしいので、以下のように書けることを教えてもらいました。DRYな感じで短くなりましたねー。すばらしい。

class Aaa(var xxx:String, var yyy:String)

class Bbb(var xxx:String, var yyy:String)

object Main {

  def dxo[T](setter:T => Unit, getter:() => T) = setter(getter())
  
  def main(args:Array[String])={
    val aaa = new Aaa("aaa","bbb");
    val bbb = new Bbb("xxx","yyy");

    dxo(aaa.xxx_= _, bbb.xxx _)
    dxo(aaa.yyy_= _, bbb.yyy _)


    println(aaa.xxx) // xxx
    println(aaa.yyy) // yyy
  }
  
}