操作Ruby类的默认值



当有多个默认值时,我怎么能只改变第二个初始化变量而不调用第一个呢?

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

在Ruby v2.0中,关键字参数需要默认值,但v2.1扩展了它们的功能,以允许必要的命名参数。例如,请看这篇文章。

最后,考虑以下两种情况(第二种情况更有趣)。

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

您可以在本文中阅读更多关于关键字参数的信息

最新更新