当有多个默认值时,我怎么能只改变第二个初始化变量而不调用第一个呢?
例如,创建一个Ruby类来返回类似于掷骰子的值,并为六面骰子提供从1到6的默认值:class Die
def initialize(min=1, max=6)
@min = min
@max = max
end
def roll
rand(@min..@max)
end
end
如果我想用这段代码来模拟投掷20面骰子的结果,我可以这样写:
p Die.new(min=1, max=20).roll
…但是是否有一种方法可以只争论第二个(最大)值?
注意-这是我困惑的地方(我不完全理解Ruby类属性和变量作用域)-如果我调用:
p Die.new(max=20).roll
…我得到nil
打印。?。(我知道这是因为rand(20..6)
返回nil
,但我认为max=
将保留第一个参数的默认最小值-而max=20
被摄取为绑定到min=
的整数20
…这对我来说很奇怪。
我想我可以重新工作Die类,以获取侧面数量的默认值,并设置相对于侧面数量的最小(或最大)值,但这与我的主要问题无关:如何只覆盖第二个默认值,而不显式地编写第一个……
假设大多数骰子的最小值通常为1,我意识到我可以颠倒最小值和最大值的顺序,如下所示:
class Die2
def initialize(max=6, min=1)
@max = max
@min = min
end
def roll
rand(@min..@max)
end
end
…然后调用最大边数,像这样:
p Die2.new(20).roll
…但是考虑到class Die
的语法(以及我倾向于在最大值之前写最小值),是否有一种方法可以只输入第二个值的参数?或者,也许我对Ruby类的理解很差?任何帮助或指导是赞赏-谢谢!
如果你写
class Die
def initialize(min=1, max=6)
@min, @max = min, max
end
end
并通过传递单个参数创建一个新实例,例如:
die = Die.new(3)
#=> #<Die:0x007fcc6902a700 @min=3, @max=6>
从返回值可以看出,参数3
已经赋值给@min
, @max
得到了它的默认值。简而言之,要将一个值传递给@max
,必须也将一个值传递给@min
(当然,除非颠倒参数的顺序)。
您可以通过使用命名参数(或命名参数)来做您想做的事情,这是在Ruby v2.0中引入的。
class Die
def initialize(min: 1, max: 6)
@min, @max = min, max
end
end
die = Die.new(max: 3)
#=> #<Die:0x007fcc698ccc00 @min=1, @max=3>
(或die = Die.new(:max=>3
)。如您所见,@min
等于它的默认值,@max
等于传递的参数3
。
最后,考虑以下两种情况(第二种情况更有趣)。
class Die
def initialize(min=1, max: 6)
@min, @max = min, max
end
end
die = Die.new(max: 3)
#=> #<Die:0x007fcc69954448 @min=1, @max=3>
class Die
def initialize(min, max: 6)
@min, @max = min, max
end
end
die = Die.new(max: 3)
#=> #<Die:0x007fa01b900930 @min={:max=>3}, @max=6>
在Ruby 2.0及更高版本中,您可以使用关键字参数来达到相同的效果:
class Die
def initialize(min: 1, max: 6) #<--declare arguments like this
@min = min
@max = max
end
def roll
rand(@min..@max)
end
end
p Die.new(max: 20).roll #<--and call like this
https://repl.it/Dyxn/0 您可以在本文中阅读更多关于关键字参数的信息