ruby - 传递参数进行初始化和在初始化中设置它们有什么区别?
问题描述
我想知道在括号中传递参数initialize
与手动设置这些值之间的区别initialize
?
class CashRegister
attr_accessor :items, :discount, :total, :last_transaction
def initialize(discount=0)
@total = 0
@discount = discount
@items = []
end
end
解决方案
不同之处在于,通过将其放入参数中,您允许调用者提供不同的值,而不是对它们进行硬编码。例如:
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
推荐阅读
- haxe - 编写 Haxe 代码_inside_ php?对于 laravel
- maven - 如何在主机 Artifactory 中配置以重用 Maven 的 settings.xml 文件中定义的存储库位置?
- r - 在 R 编程中找到最大平均误差
- c++ - C++:切片时迭代器的约定,尤其是访问最后一个元素并最终删除它
- node.js - 将 node.js 中的数据添加到 Google BigQuery 表
- r - 我无法在 R 中使用 One Class 生成分类的混淆矩阵
- java - 有目的的编程 Coursera 课程的编程作业帮助
- c# - 防止用户检查 listView .NET 的项目
- c# - 动画帮助/动画师
- powershell - 如何导入包(不是模块)?