gpt4 book ai didi

ruby - 操作 Ruby 类默认值

转载 作者:太空宇宙 更新时间:2023-11-03 17:30:30 24 4
gpt4 key购买 nike

当有多个默认值时,如何只更改第二个初始化变量而不调用第一个?

例如,创建一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com