Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

24.01.2024

Ruby: ключові слова з опущеним аргументом

Вже два роки, як в Ruby є можливість опустити значення іменованого аргументу або ключа в хеші, якщо вона збігається з самим ключем. Тобто з версії 3.1. Мене то довгий час обминало, бо на Ruby я пишу нечасто, а синтаксис у цієї фічі трохи дивакуватий:

query = 'SELECT * FROM foos'
option = {timeout: 10, username:, password:}
adapter.execute(query:, options:)

Оці двокрапки мені особисто виглядають, як помилка. Особливо в Ruby, який славиться своїм акуратним та мінімалістичним синтаксисом. Втім, без двокрапки їх було б не відрізнити від нейменованих аргументів, це зрозуміло. В JavaScript, наприклад, підхід простіше, бо там іменовані аргументи — це ті ж самі обʼєкти, та неоднозначності немає (ну, поки ми не хочемо повернути обʼєкт з функції-стрілочки: x => {x} - тоді JavaScript переплутає обʼєкт та тіло функції.)

А щодо Ruby, то я знайшов що такі короткі іменовані аргументи — це чудова заміна позиційним аргументам всередині власного коду. З іменованими аргументами код стає надійніше, бо більше шанс на автоматичне виявлення помилок при рефакторингу.

def run_logic(a, b)
# переплутали порядок та не помітили
run_logic(b,a)
# змінили аргумент та не помітили
run_logic(a,c)

def run_logic(a:, b:)
# порядок не має значення
run_logic(b:,a:)
# помилка: немає такого аргументу
run_logic(a:, c:)

Ясно, що для того локальні змінні повинні мати ті ж назви, що й аргументи, втім так часто само собою буває всередині модуля.