当有多个默认值时,如何只更改第二个初始化变量而不调用第一个?
例如,创建一个 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
被摄取为绑定(bind)到 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
。
Ruby v2.0 中的关键字参数需要默认值,但 v2.1 扩展了它们的功能以允许所需的命名参数。参见,例如,this article .
最后,考虑以下两种情况(第二种情况更有趣)。
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 - 操作 Ruby 类默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40099433/