В чем разница между передачей аргументов для инициализации и установкой их внутри инициализации? - PullRequest
3 голосов
/ 09 апреля 2020

Я хотел бы знать разницу между передачей аргументов в скобках для initialize против установки этих значений вручную в initialize?

class CashRegister
  attr_accessor :items, :discount, :total, :last_transaction

  def initialize(discount=0)
    @total = 0
    @discount = discount
    @items = []
  end
end

1 Ответ

5 голосов
/ 09 апреля 2020

Разница в том, что, указав его в аргументах, вы позволяете вызывающей стороне предоставлять разные значения, а не жестко их кодировать. Например:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...