Разница в том, что, указав его в аргументах, вы позволяете вызывающей стороне предоставлять разные значения, а не жестко их кодировать. Например:
def initialize(discount=0, total=0, items=[])
@total = total
@discount = discount
@items = items
end
Теперь вы можете вызывать его без аргументов или указать аргументы:
MyClass.new
# uses all defaults
MyClass.new(123)
# Uses custom value for discount only
MyClass.new(1, 2, ["item"])
# Uses custom values for all
Проблема этого подхода в том, что происходит, когда вы хотите дать пользовательское значение для итога (второй аргумент), но использовать значение по умолчанию для скидки (первый)? С позиционными аргументами вы не можете. Поэтому вместо ключевых слов рекомендуется использовать ключевые аргументы:
def initialize(discount: 0, total: 0, items: [])
Теперь вы можете указывать пользовательские значения для любой комбинации трех аргументов, например:
MyClass.new
# uses all defaults
MyClass.new(total: 123)
# this uses default values for discount and items