【问题标题】:Why are scala functions limited to 22 parameters?为什么scala函数限制为22个参数?
【发布时间】:2010-11-11 07:33:21
【问题描述】:

并不是说我实际上已经接近那个限制,但我一直想知道:他们为什么停在Function22/Tuple22。 JVM限制?任意选择?

【问题讨论】:

标签: scala


【解决方案1】:

函数和元组被编译器重写为对象,并且只定义了Function0Function22Tuple0Tuple22。我认为 22 的限制完全是任意的,但有限制的原因不是。

这样想:要运行 Scala 应用程序,运行它所需的类必须存在。如果编译器会为函数动态创建类,那么这些类将不会包含在 Scala 库 JAR 中,因此您必须将它们包含在您的应用程序中。这可以工作,但是你会遇到类的完全限定名称应该是什么的问题:如果它们对于所有应用程序都相同,那么你会发生冲突,因为库将包含相同的类,并且如果名称不是同样,您最终会遇到不兼容问题 - 库中的函数与您应用中的函数不同。

【讨论】:

  • 实际上是 Tuple1 到 Tuple22,但这只是一个小细节。
  • @DarianLewin Tuple0 被称为Unit
  • 仍然不太相信为什么这些类不应该由编译器动态生成。命名和包装的问题可以通过遵循命名约定来轻松解决。不确定我是否错过了大局。
【解决方案2】:

没有这样的限制。即使标准库最多只定义Function22,你也可以根据需要定义Function23,直到JVM限制。或者您可以将参数分组到元组中。或者你可以停止假装任何函数都需要多个参数:

a => b => c => d => e => ...

柯里化函数可以接受任意数量的参数,直到堆栈大小的限制。

【讨论】:

    【解决方案3】:

    这主要是任意的,但 JVM 上有一些基本限制,大致规定了限制需要是什么。

    主要问题是案例类的模式匹配。如果允许一个案例类更大,那么生成的模式匹配代码很容易超过最大有效方法大小。其他所有内容(Product、Function、Tuple...)都遵循因此为案例类选择的 22 参数限制。

    另外...如果您正在编写具有 > 22 个参数的函数/元组,那么您可能早就该重新设计了 :)

    【讨论】:

    • 有时这不是您的设计。假设您正在编写一个案例类来表示具有超过 22 个参数的网络协议消息。或解析您无法控制的服务器的 JSON 响应。
    • @Chad:同意。有时,改变设计是不可行的。
    【解决方案4】:

    Drop function 22 limit #1758 dotty (Scala 3) 中的限制 22 为 dropped

    函数的最大参数个数限制为22 类型和元组类型中的最大字段数是 掉了。

    函数现在可以有任意数量的参数。职能 超过Function22 被删除为新特征scala.FunctionXXLTuple22 之外的元组被删除为新的特征 scala.TupleXXL。两个都 其中一些是使用数组实现的。

    For example,

    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

    【讨论】:

      【解决方案5】:

      任意选择。即使这些类是自动生成的,也必须有一个限制。

      请注意,您可以通过使用 HLists 或类似结构来获得类似“任意大小的元组”的内容(请参阅http://jnordenberg.blogspot.com/2008/08/hlist-in-scala.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 2020-03-11
        • 2015-06-06
        • 2018-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多