【问题标题】:How to pass a scala class as an object into a function parameter?如何将 scala 类作为对象传递给函数参数?
【发布时间】:2019-07-23 00:53:55
【问题描述】:

如何运行 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 函数?

【问题讨论】:

  • 第一个f 是一个函数,从RefIntUnit (相当于Java 的void)。因此,您需要传递一个函数,而不是一个值。 - 其次,由于函数返回一个Unit,存储它的结果_(in first, second & third) 是没有意义的。 - 第三,x,即使在内部被f 静音,也不会重新分配,因此它可能(恕我直言)是一个val。 - 最后你可以像这样调用refint1refint1 { ri => ri.set(i); i += 1 } where var i = 0

标签: scala class reference arguments parameter-passing


【解决方案1】:

正如 Luis 在 cmets 中所说,f 返回 Unit,它基本上是 void。这应该可以解决您的问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-09
    • 2012-03-30
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多