Как передать класс scala как объект в параметр функции? - PullRequest
0 голосов
/ 01 марта 2019

Как запустить функцию refint1?Я пробовал var x = new RefInt(5), а затем делал scala> argpass.refint1(x), но получал ошибку 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?

1 Ответ

0 голосов
/ 01 марта 2019

Как сказал Луис в комментариях, f возвращает Unit, что в основном является недействительным.Это должно решить вашу проблему:

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)))
...