Я можу помилятися, оскільки про це ніхто не згадував, але я також мав враження, що причиною цього є також рубінова спадщина того, що можна викликати функції без дужок.
Arity, очевидно, задіяний, але дозволяє відкласти його на деякий час і використовувати функції без аргументів. У такій мові, як javascript, де дужки є обов'язковими, легко змінити різницю між передачею функції в якості аргументу та викликом функції. Ви називаєте це лише тоді, коли використовуєте дужки.
my_function // argument
(function() {}) // argument
my_function() // function is called
(function() {})() // function is called
Як бачите, називати його чи ні не має великого значення. Але еліксир і рубін дозволяють викликати функції без дужок. Це особистий вибір, який мені особисто подобається, але він має цей побічний ефект, ви не можете використовувати лише ім'я без дужок, оскільки це може означати, що ви хочете викликати функцію. Це для чого &
. Якщо ви залишаєте arity appart на секунду, попередньо додавши ім'я функції, &
означає, що ви явно хочете використовувати цю функцію як аргумент, а не те, що ця функція повертає.
Тепер анонімна функція трохи відрізняється тим, що вона в основному використовується як аргумент. Знову ж це вибір дизайну, але раціональним за ним є те, що він в основному використовується ітераторами типу функцій, які приймають функції як аргументи. Тож очевидно, що вам не потрібно використовувати, &
оскільки вони вже вважаються аргументами за замовчуванням. Це їх призначення.
Тепер остання проблема полягає в тому, що іноді доводиться викликати їх у своєму коді, оскільки вони не завжди використовуються з функцією ітератора, або ви можете самі кодувати ітератор. Невелика історія, оскільки рубін орієнтований на об'єкт, основним способом це було використання call
методу на об'єкті. Таким чином, ви можете зберігати необов’язковість поведінки дужок.
my_lambda.call
my_lambda.call()
my_lambda_with_arguments.call :h2g2, 42
my_lambda_with_arguments.call(:h2g2, 42)
Зараз хтось придумав ярлик, який в основному схожий на метод без назви.
my_lambda.()
my_lambda_with_arguments.(:h2g2, 42)
Знову ж таки, це вибір дизайну. Тепер еліксир не орієнтований на об'єкти, тому не вимагайте використання першої форми точно. Я не можу говорити за Хосе, але схоже, що друга форма була використана в еліксирі, оскільки вона все ще схожа на виклик функції з додатковим символом. Це досить близько до виклику функції.
Я не замислювався над усіма плюсами та мінусами, але схоже, що в обох мовах ви можете уникнути лише дужок, доки ви зробите дужки обов’язковими для анонімних функцій. Схоже, це так:
Обов’язкові дужки VS Трохи інші позначення
В обох випадках ви робите виняток, оскільки змушуєте обидва поводитись по-різному. Оскільки є різниця, ви можете також зробити це очевидним і піти на різні позначення. Обов’язкові дужки виглядатимуть природно в більшості випадків, але дуже заплутано, коли справи йдуть не так, як планували.
Ось ви йдете. Зараз це може бути не найкращим поясненням у світі, оскільки я спростив більшість деталей. Крім того, більшість з них - це вибір дизайну, і я намагався дати їм причину, не судячи про них. Я люблю еліксир, я люблю рубін, мені подобаються виклики функцій без дужок, але, як і ти, я вважаю, що наслідки доволі помилкові час від часу.
А в еліксирі - це просто ця додаткова точка, тоді як у рубіні ви маєте над цим блоки. Блоки дивовижні, і я здивований, скільки ви можете зробити лише з блоками, але вони працюють лише тоді, коли вам потрібна лише одна анонімна функція, яка є останнім аргументом. Тоді, оскільки ви маєте змогу мати справу з іншими сценаріями, тут виходить весь метод плутанини / lambda / proc / block.
У всякому разі ... це поза сферою.