什么是Range类的文字构造函数的命名构造函数?

时间:2017-01-07 21:59:41

标签: ruby-on-rails ruby

对于rails来说有点新鲜。我正在阅读Michael Hartl的学习轨道教程4.4.1中的练习,我对于Range类的命名构造函数有点不清楚

当我在控制台中键入文字构造函数时,它返回适当的值

(1..10)
=>1..10

但是当我尝试命名的构造函数

Range.new(1..10)

我收到错误

ArgumentError: wrong number of arguments (given 1, expected 2..3)
    from (irb):104:in `initialize'
    from (irb):104:in `new'

我尝试添加许多类型的额外参数,即

Range.new(1)..Range.new(10)
Range.new(1)..(10)
etc..

但我总是遇到一个争论错误。

2 个答案:

答案 0 :(得分:4)

  

ArgumentError:参数数量错误(给定1,预期2..3)

应该提示您至少需要2个参数:

Range.new(1,10)

第3个参数是指定是否排除范围的最后一个元素:

Range.new(1,10,false).to_a
# equivalent to (1..10)
# => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Range.new(1,10,true).to_a
# equivalent to (1...10)
# => [1, 2, 3, 4, 5, 6, 7, 8, 9]

请参阅documentation

您的代码

Range.new(1..10)

仅使用一个参数仍为Range#new:已初始化的范围!

Range.new(1)..Range.new(10)

这是a..b语法,因此它会尝试初始化ab之间的范围。什么是aRange.new(1),未定义,因为它只有1个参数。无论如何,您无法在2个范围之间创建范围:

Range.new(1,2)..Range.new(4,5)
#=> ArgumentError: bad value for range

Range.new(1)..(10)

和以前一样的问题。 Range.new只有一个参数,这是范围和整数之间的范围!

答案 1 :(得分:2)

您可以使用ri命令

阅读文档
ri Range.new

打印

= Range.new

(from ruby site)
------------------------------------------------------------------------------
  Range.new(begin, end, exclude_end=false)    -> rng

------------------------------------------------------------------------------

Constructs a range using the given begin and end. If the exclude_end parameter
is omitted or is false, the rng will include the end object; otherwise, it
will be excluded.

注意,ri在终端命令行和pry repl内都有效。