代码之家  ›  专栏  ›  技术社区  ›  Jackson Davis

为什么scala函数仅限于22个参数?

  •  35
  • Jackson Davis  · 技术社区  · 14 年前

    不是说我已经接近极限了,而是我一直在想:为什么他们会停在 Function22 / Tuple22 . JVM限制?任意选择?

    4 回复  |  直到 6 年前
        1
  •  29
  •   Theo    14 年前

    函数和元组被编译器重写为对象,并且 Function0 通过 Function22 Tuple0 通过 Tuple22 已定义。我认为22的限制完全是武断的,但是有限制的原因不是。

    这样想:要运行scala应用程序,必须存在运行它所需的类。如果编译器动态地为函数创建类,那么这些类将不会包含在scala库jar中,因此您必须将它们包含在应用程序中。这样做是可行的,但是你会有一个问题,那就是类的完全限定名应该是什么:如果所有应用程序的完全限定名都是相同的,那么你会有冲突,因为库中会包含相同的类,如果名称不相同,那么最终会导致不兼容——很有趣。库中的操作与应用程序中的函数不同。

        2
  •  26
  •   Apocalisp    6 年前

    没有这样的限制。即使标准库最多只能定义函数22,如果需要,也可以定义函数23,直到达到JVM限制。或者可以将参数分组为元组。或者您可以停止假装任何函数接受多个参数:

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

    curried函数可以接受任意多的参数,最多可以接受堆栈大小的限制。

        3
  •  11
  •   Kevin Wright    14 年前

    大部分都是武断的,但是 对JVM的一些基本限制大致规定了限制需要是什么。

    主要问题是案例类上的模式匹配。如果case类允许大得多,则生成的模式匹配代码很容易超过最大有效方法大小。其他一切(产品、函数、元组等)都遵循22个参数限制,因此这些参数限制是为case类选择的。

    也。。。如果您正在编写带有>22个参数的函数/元组,那么您可能需要重新设计:)

        4
  •  4
  •   Landei    14 年前

    任意选择。即使这些类是自动生成的,但在某些地方也必须有限制。

    注意,通过使用hlist或类似的结构,您可以拥有类似“任意大小的元组”(请参见 http://jnordenberg.blogspot.com/2008/08/hlist-in-scala.html )

    推荐文章