当前位置:  开发笔记 > 编程语言 > 正文

如何从scala中的匿名函数中获取价值?

如何解决《如何从scala中的匿名函数中获取价值?》经验,为你挑选了1个好方法。

我正在尝试学习scala并理解函数和方法之间的区别.

这是我写的非常简单的代码 -

 scala> class C ( acc:Int) {
       |  val minc = ( acc + 1 )
       |  val func = { () => acc += 3 }
       | }

  scala> val c1 = new C(3)
         c1: C = C@55e610e3

  scala> c1.minc
         res2: Int = 4

  scala> c1.func
         res3: () => Int = 

我理解在实例化对象c1上调用函数func的结果存储为另一个表达式res3.

但是我希望从C类内部的匿名函数()= acc +3中获取价值.

如果我尝试将参数传递给res3表达式,则scala会抛出错误

  scala> res3(4)
   :11: error: too many arguments for method apply: ()Int in trait    Function0
   res3(4)
        ^

如何从中获取价值?

PS - 我刚开始使用scala,不知道这是否可能?



1> Chris Naurot..:

这是你的定义func:

val func = { () => acc += 3 }

让我们来看看REPL中的类型func.

scala> val c1 = new C(3)
val c1 = new C(3)
c1: C = C@58db88e9

scala> c1.func
c1.func
res29: () => Unit = 

用简单的英语,这意味着"func引用一个不接受任何参数且不返回值的函数." Unit表示该方法不返回任何内容.如果您来自Java,那么它类似于void返回类型. function0意味着它接受0个参数.

接下来,让我们看一下示例中的失败调用.

scala> c1.func(4)
c1.func(4)
:10: error: too many arguments for method apply: ()Unit in trait Function0
              c1.func(4)
                     ^

现在我们知道了方法签名func,这个错误消息应该更有意义.我们知道这func是指一个不接受任何参数的函数,但是在这个调用中,你试图用一个整数参数来调用它.由于方法调用的参数太多,因此Scala会将此错误地报告为错误.

4作为一个论点,我并不完全确定你想做什么.我最好的猜测是你试图通过添加3acc然后将其返回给调用者来应用函数来计算其结果.如果我是对的,那么我们可以重新定义C:

class C(var acc:Int) {
  val minc = ( acc + 1 )
  val func = () => {
    acc += 3
    acc
}

scala> val c1 = new C(3)
val c1 = new C(3)
c1: C = C@58db88e9

scala> c1.func()
c1.func()
res44: Int = 6

当我们调用时c1.func(),不传递任何参数,因此它正确匹配定义的方法签名.

另一种可能性是你试图参数化增量并4在调用中传递给它.如果是这样,那么你可以这样做:

class C(var acc:Int) {
  val minc = ( acc + 1 )
  val func = (delta: Int) => {
    acc += delta
    acc
  }
}

scala> c1.func(4)
c1.func(4)
res45: Int = 7

在这种情况下,我们声明匿名函数接受1个类型的参数Int,因此当我们传入4方法调用时,它正确匹配方法签名.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有