2010-12-22 57 views
3

使用Ruby中的范围,您可以执行0..5以包含0和5之间的所有数字(包括0和5)。您还可以执行0...5以包含除5之外的相同数字。如何:不包含第一个值的Ruby范围

(1..5) === 5 
=> true 
(1...5) === 5 
=> false 
(1...5) === 4.999999 
=> true 

有没有办法排除第一个数字而不是最后得到这样的结果?

(1...5) === 1 
=> false 
(1...5) === 1.00000001 
=> true 

回答

2

不,这里没有内置的支持。如果这种行为是必要的,你可能想要推出自己的Range类。

+0

感谢您花时间了解我所需要的(不仅仅是2 ... 5)。太糟糕了,没有内置的支持。我认为测试数字> 1 &&数字<= 5比创建自己的类更容易。我想如果我确实想创建自己的类,我可以在内部使用Range对象,但只需提供包含?,成员?等方法的执行略有不同。 – dontangg 2010-12-22 21:06:20

+0

您可以在内部使用Range对象,并取消所有值。例如,内部范围将是(-5 ... -1)。这将包括-5,但不包括-1。当然,这只适用于其值为否定的范围。 – Mashmagar 2013-04-24 16:38:27

1

除了只发送first_arg.succ而不是first_arg?不,对此没有特别的支持。

+0

除(2..5)`实际上不符合要求外:/ – Matchu 2010-12-22 19:15:31

+1

要求并非基于对Range的工作原理的充分理解。当发生这种情况时,我们通常会回到学习如何在语言或对象的限制范围内工作,备份几个步骤并对其进行不同的运行。改变语言或物体的行为以符合规格可能会导致疯狂,或者可能烧掉气氛或打开一扇门进入另一个维度([不应被指名的人])(http://en.wikipedia.org/wiki/)克苏鲁)可以返回并为我们所有人带来痛苦......洛,他来...... – 2010-12-22 20:43:59

0

你可以猴子补丁范围添加一个方法来表现你想要的方式。例如:

class Range 
    def exclusive() 
     Range.new(self.first+1, self.last-1) 
    end 
end 

(1..5).exclusive === 5 
==>false 
(1..5) === 5 
==>true 

虽然它会改变现有类的功能,但要注意monkeypatching。在这种情况下可能有更好的办法,但考虑到这个问题,这是一个可以接受的答案。

1

非本地范围。你可以混淆它的思想,但你最好使用递增的第一个值。这是丑陋的,但:

[(1..5).to_s].map{ |s| a,b=s.split('..').map{|i| i.to_i}; (1+a .. b) } #=> [2..5] 

Range.new(*[(1..5).to_s].map{ |s| a,b=s.split('..').map{|i| i.to_i}; [1+a,b] }.flatten) #=> 2..5 

irb(main):004:0> asdf = (1..5) 
=> 1..5 
irb(main):005:0> Range.new(asdf.min.succ, asdf.max) 
=> 2..5 

似乎都不过分优雅。

相关问题