1

scala でそのようなことを行う自然な方法を見つけることができませんでした:

class Car {
  var speed: Int
  var color: String
}

var myCar = new Car()

myCar.set {
  speed = 5
  color = "green"
}

Groovyなどの他の言語でも可能であることは知っています。私はまた、次のようなコンストラクターでそれを行うことができることも知っています:

val myCar = new Car { 
  speed = 5
  color = "green"
}

オブジェクトの構築時ではなく、オブジェクトが既に作成された後で、同じことを行う方法に興味があります

これは私がこれまでやってきたことです:

class Car (var speed: Int, var color: String) {

  def set(f: (Car) => Unit) = {
    f(this)
  }

}

val myCar = new Car(5, "red")
myCar.set { c =>
  c.speed = 12
  c.color = "green"
}

しかし、属性ごとに 'c' var を記述する必要があるのは好きではありません

どうすればそれができるか、またはもっと簡単な方法があるかどうかについてのアイデアはありますか??

4

3 に答える 3

2

どうしても必要な場合を除き、変更可能なクラスは避ける必要があります。通常、Scala では次のようにします。

case class Car(speed: Int, color: String)

val c1 = Car(5, "red")
val c2 = c1.copy(speed = 12, color = "green")

(その後、変更されていないままc2、新しいバージョンの車です。)c1


可変タイプに固執したい場合は、

class Car(var speed: Int, var color: String)

val myCar = new Car(5, "red")
import myCar._
speed = 12
color = "green"

専用の方法で行くset

class Car(var speed: Int, var color: String) {
  def set(speed: Int = this.speed, color: String = this.color): Unit = {
    this.speed = speed
    this.color = color
  }
}

val myCar = new Car(5, "red")
myCar.set(speed = 12, color = "green")
myCar.set(color = "blue")
于 2013-08-30T14:36:48.653 に答える
1

変数をインポートすることでそれを行うことができます:

class Car {
  var speed: Int = _
  var color: String = _
}

// ...
val myCar = new Car();
// a blocks that works with myCar:
{
    import myCar._
    // access the content without any prefix
    speed = 5
    color = "green"
}
于 2013-09-05T11:25:36.227 に答える
1

var の再割り当てが見苦しいという意見には誰もが同意しますが、これは可能な解決策です。

object DoTo { 
  def apply[T](that: T)(functions: (T) => Unit*): T = {
    functions foreach { _.apply(that) }
    that
  }    
}


class Car (var speed: Int, var color: String) {
  def move() = println("moving")
  def stop() = println("stop")
}


val myNewCar = DoTo(new Car(12, "red")) (
  _.move(),
  _.stop(),
  _.speed = 15,
  _.color = "green"
)

これはまさに私が最初に望んでいたものではありませんが、マクロを使用しないとより単純なものを見つけることができません:-(

于 2013-09-05T08:45:36.140 に答える