Вы используете два разных типа аргументов выше, аргументы с ключевыми словами и позиционные аргументы.Хорошее описание разницы можно найти по адресу:
https://robots.thoughtbot.com/ruby-2-keyword-arguments
Используя приведенный пример:
def mysterious_total(subtotal, tax, discount)
subtotal + tax - discount
end
mysterious_total(100, 10, 5) # => 105
Выше приведен правильный метод, однако, когдавы вызываете его, вы не знаете, в какое место ставить аргументы, не глядя на определение самого метода.Если вы введете промежуточный итог и будете облагать налогом неверный результат, вы получите неправильный результат.Аргументы ключевого слова предотвращают это, указывая название аргумента:
def obvious_total(subtotal:, tax:, discount:)
subtotal + tax - discount
end
obvious_total(subtotal: 100, tax: 10, discount: 5) # => 105
Это, на мой взгляд, гораздо лучший подход, хотя не каждый рубиновый кодировщик соглашается.Таким образом, вы можете изменить ваши аргументы, не нарушая метод, и метод имеет смысл везде, где вы его читаете.Если вы хотите использовать некоторые из этих опций, вы можете сделать следующее:
def obvious_total(subtotal: 100, tax: 10, discount: 5)
subtotal + tax - discount
end
Если вы сейчас просто вызовете obvious_total
без каких-либо аргументов, он будет использовать заданные вами аргументы по умолчанию, и вы можетевызовите его только с одним аргументом, obvious_total(subtotal: 200)
Делать это с использованием аргументов размещения гораздо сложнее, так как код не знает, какой аргумент вы пропустили.Используя первый пример:
def mysterious_total(subtotal = 100, tax = 10, discount = 5)
subtotal + tax - discount
end
если я просто позвоню mysterious_total(100)
, система не знает, какой аргумент я пропускаю
Наконец, это плохая практика - смешивать позиционные иключевые аргументы в том же определении метода.Дальнейшее чтение:
https://makandracards.com/makandra/36011-ruby-do-not-mix-optional-and-keyword-arguments