首页 > 解决方案 > 传递参数进行初始化和在初始化中设置它们有什么区别?

问题描述

我想知道在括号中传递参数initialize与手动设置这些值之间的区别initialize

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

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

标签: ruby

解决方案


不同之处在于,通过将其放入参数中,您允许调用者提供不同的值,而不是对它们进行硬编码。例如:

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

推荐阅读