Почему функции scala ограничены 22 параметрами? - PullRequest
35 голосов
/ 11 ноября 2010

Не то чтобы я фактически приблизился к этому пределу, но я всегда удивлялся: почему они останавливаются на Function22 / Tuple22.Ограничение JVM?Произвольный выбор?

Ответы [ 4 ]

29 голосов
/ 11 ноября 2010

Функции и кортежи переписываются компилятором как объекты, и определяются только от Function0 до Function22 и Tuple0 до Tuple22.Я думаю, что ограничение 22 совершенно произвольно, но причина для ограничения не в том.

Подумайте об этом так: для запуска приложения Scala должны присутствовать классы, необходимые для его запуска.Если компилятор будет динамически создавать классы для функций, то эти классы не будут включены в JAR библиотеки Scala, поэтому вам придется включить их в ваше приложение.Это может сработать, но тогда у вас возникнет проблема с тем, какими должны быть полностью квалифицированные имена классов: если бы они были одинаковыми для всех приложений, то возникли бы конфликты, поскольку библиотеки содержали бы одинаковые классы, а если имена не былито же самое вы получите несовместимости - функции из библиотек не будут такими же, как функции в вашем приложении.

26 голосов
/ 11 ноября 2010

Нет такого ограничения.Даже если стандартные библиотеки определяют только до Function22, вы можете определить Function23, если вам это нужно, до предела JVM.Или вы можете сгруппировать аргументы в кортежи.Или вы можете просто перестать притворяться, что любая функция принимает более одного аргумента:

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

Функции с карри могут принимать столько аргументов, сколько вы хотите, вплоть до предела размера вашего стека.

11 голосов
/ 11 ноября 2010

Это в основном произвольно, но - это некоторые базовые ограничения для JVM, которые приблизительно определяют, каким должен быть предел.

Основная проблема - сопоставление с образцом для классов дел.Если класс падежа может быть намного больше, тогда сгенерированный код сопоставления с образцом может очень легко превысить максимальный допустимый размер метода.Все остальное (Product, Function, Tuple, ...) просто следует ограничению в 22 параметра, которое было выбрано для классов дел.

Также ... Если вы пишете функции / кортежи с> 22 параметрамитогда вы, вероятно, запоздали на редизайн:)

4 голосов
/ 11 ноября 2010

Произвольный выбор. Хотя эти классы генерируются автоматически, где-то должен быть предел.

Обратите внимание, что вы можете иметь что-то вроде "кортежей произвольного размера", используя HLists или подобные конструкции (см. http://jnordenberg.blogspot.com/2008/08/hlist-in-scala.html)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...