【发布时间】:2010-11-11 07:33:21
【问题描述】:
并不是说我实际上已经接近那个限制,但我一直想知道:他们为什么停在Function22/Tuple22。 JVM限制?任意选择?
【问题讨论】:
-
这些限制在 6 年后仍然存在:stackoverflow.com/a/39981285/6309
标签: scala
并不是说我实际上已经接近那个限制,但我一直想知道:他们为什么停在Function22/Tuple22。 JVM限制?任意选择?
【问题讨论】:
标签: scala
函数和元组被编译器重写为对象,并且只定义了Function0 到Function22 和Tuple0 到Tuple22。我认为 22 的限制完全是任意的,但有限制的原因不是。
这样想:要运行 Scala 应用程序,运行它所需的类必须存在。如果编译器会为函数动态创建类,那么这些类将不会包含在 Scala 库 JAR 中,因此您必须将它们包含在您的应用程序中。这可以工作,但是你会遇到类的完全限定名称应该是什么的问题:如果它们对于所有应用程序都相同,那么你会发生冲突,因为库将包含相同的类,并且如果名称不是同样,您最终会遇到不兼容问题 - 库中的函数与您应用中的函数不同。
【讨论】:
Tuple0 被称为Unit
没有这样的限制。即使标准库最多只定义Function22,你也可以根据需要定义Function23,直到JVM限制。或者您可以将参数分组到元组中。或者你可以停止假装任何函数都需要多个参数:
a => b => c => d => e => ...
柯里化函数可以接受任意数量的参数,直到堆栈大小的限制。
【讨论】:
这主要是任意的,但 JVM 上有一些基本限制,大致规定了限制需要是什么。
主要问题是案例类的模式匹配。如果允许一个案例类更大,那么生成的模式匹配代码很容易超过最大有效方法大小。其他所有内容(Product、Function、Tuple...)都遵循因此为案例类选择的 22 参数限制。
另外...如果您正在编写具有 > 22 个参数的函数/元组,那么您可能早就该重新设计了 :)
【讨论】:
Drop function 22 limit #1758 dotty (Scala 3) 中的限制 22 为 dropped:
函数的最大参数个数限制为22 类型和元组类型中的最大字段数是 掉了。
函数现在可以有任意数量的参数。职能 超过
Function22被删除为新特征scala.FunctionXXL和Tuple22之外的元组被删除为新的特征scala.TupleXXL。两个都 其中一些是使用数组实现的。
object drop22limit extends App {
val f23 = (x1: Int, x2: Int, x3: Int, x4: Int, x5: Int, x6: Int, x7: Int, x8: Int, x9: Int, x10: Int, x11: Int, x12: Int, x13: Int, x14: Int, x15: Int, x16: Int, x17: Int, x18: Int, x19: Int, x20: Int, x21: Int, x22: Int, x23: Int) => x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23
val result = f23(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)
println(result)
}
输出276。有关任意元组和函数之间相互作用的示例,请参阅Add generalized tupled functions abstraction #6568
【讨论】:
任意选择。即使这些类是自动生成的,也必须有一个限制。
请注意,您可以通过使用 HLists 或类似结构来获得类似“任意大小的元组”的内容(请参阅http://jnordenberg.blogspot.com/2008/08/hlist-in-scala.html)
【讨论】: