如何将scala类作为对象传递给函数参数?

问题描述 投票:0回答:1

如何运行refint1函数?我试过var x = new RefInt(5)然后做scala> argpass.refint1(x)but在控制台中得到一个found: RefInt, required : argpass.RefInt => Unit错误。

object argpass{
       class RefInt (initial : Int) {
         private var n : Int = initial
         def get () : Int = n
         def set (m : Int) : Unit = { n = m}
        }
        def refint1 ( f: RefInt => Unit) : (Int, Int, Int) = {
          var x = new RefInt(5)
          val first = f(x)
          val firstget = x.get
          val sec = f(x)
          val secget = x.get
          val third = f(x)
          val thirdget = x.get
          (firstget, secget, thirdget)
    }

//如何运行refint1函数?

scala class reference arguments parameter-passing
1个回答
1
投票

正如路易斯在评论中所说,f返回单位,这基本上是无效的。这应该可以解决您的问题:

class RefInt(initial: Int) {
  var n: Int = initial
  def get(): Int = n
  def set(m: Int): Unit = { n = m }
}

def refint1(f: RefInt => Unit): (Int, Int, Int) = {
  var x = new RefInt(5)  
  f(x)
  val firstget = x.get
  f(x)
  val secget = x.get
  f(x)
  val thirdget = x.get

  (firstget, secget, thirdget)
}

话虽这么说,我认为你可以改善你的设计。这是解决同一问题的另一种方法:

case class RefInt(initial: Int)

def refInt1(initial: RefInt, f: RefInt => RefInt) : (Int, Int, Int) = {  
  val x0 = f(initial)
  val x1 = f(x0)
  val x2 = f(x1)

  (x0.initial, x1.initial, x2.initial)
}

println(refInt1(RefInt(5), ri => ri.copy(ri.initial * 2)))
© www.soinside.com 2019 - 2024. All rights reserved.