ruby - 操作 Ruby 类默认值

标签 ruby arguments dice

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

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

相关文章:

c++ - 如何在 C++ 中使用成员变量作为默认参数?

java - 掷骰子程序,但我需要从不同的类传输输入数据

java - 如何在 Java 中确定三个骰子的顺子?

ruby-on-rails - rails : Shoulda-matchers belong_to optional test

Ruby 标签列表到流畅的正则表达式

ruby-on-rails - 限制用户在相关模型的 Controller 中的访问

ruby-on-rails - 从 Restful 身份验证迁移到设计

python - 为什么此代码仅适用于 Something() 中的 *args?

bash - 如何正确识别/传递 bash 参数

Java:使用静态方法在 Main 之外的方法中调用对象