function - 为什么案例类可以用作参数中的函数

标签 function scala functional-programming case-class

偶尔,我发现案例类的一个有趣的特性。 foo 需要一个函数,其中 3 Int 到一个案例类,代码如下所示:

case class Whatever(a: Int, b: Int, c: Int)

def foo(f: (Int, Int, Int) => Whatever) = f(1,2,3).c

foo(Whatever) //compilation fine, scala complier is powerful ...........

如果Whatever是普通类,显然编译会失败。

谁能解释一下为什么可以这样使用案例类,我怀疑这是工厂应用方法的原因,但我不确定。另外,如果是普通类,是否可以这样作为案例类使用。

最佳答案

Scala 编译器为案例类生成伴生对象并实现一些东西(实现 AbstractFunction3、应用、取消应用):

javap Whatever\$.class 
Compiled from "Test.scala"
public final class Whatever$ extends scala.runtime.AbstractFunction3<java.lang.Object,   java.lang.Object, java.lang.Object, Whatever> implements scala.Serializable {
  public static final Whatever$ MODULE$;
  public static {};
  public final java.lang.String toString();
  public Whatever apply(int, int, int);
  public scala.Option<scala.Tuple3<java.lang.Object, java.lang.Object, java.lang.Object>> unapply(Whatever);
  public java.lang.Object apply(java.lang.Object, java.lang.Object, java.lang.Object);
}

关于function - 为什么案例类可以用作参数中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419812/

相关文章:

java - 如何在java/scala中获取系统IOPS和磁盘IOPS

recursion - 如何在 Scheme/Racket 中使用尾递归实现追加过程?

javascript - JS 数组 — 将一维数组重新组织为 N 组按顺序放置值的二维数组

Javascript - 如何将原始对象传递给回调函数

excel - 在一张工作表上重新计算 Excel VBA 函数会破坏其他工作表

r - 传递 `chr` 类型参数并更新嵌套函数的内容以在 R 中返回?

PHP:以 bool 值作为返回值的引用函数——奇怪的通知

r - "Formal argument "foo "matched by multiple arguments"- 如何在 R 中处理这个?

scala - 如何在 Play 中结合正文解析器和安全性

scala - 如何阻止 Option-ality 感染一切