Как: Ruby Range, который не включает первое значение - PullRequest
3 голосов
/ 22 декабря 2010

С помощью диапазонов в Ruby вы можете сделать 0..5, чтобы включить все числа между 0 и 5 включительно. Вы также можете сделать 0...5, чтобы включить те же числа, кроме 5, не включенных.* Есть ли способ исключить первое число вместо последнего, чтобы получить такой результат?

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

Ответы [ 4 ]

2 голосов
/ 22 декабря 2010

Нет, для такого диапазона нет встроенной поддержки.Возможно, вы захотите бросить свой собственный Range -подобный класс, если это необходимо.

1 голос
/ 22 декабря 2010

Не изначально с диапазоном.Вы можете возиться с его разумом, но вам лучше использовать увеличенное первое значение.Это уродливо, но:

[(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

Ни один из них не выглядит слишком элегантным.

1 голос
/ 22 декабря 2010

Кроме просто отправки first_arg.succ вместо first_arg?Нет, особой поддержки для этого нет.

0 голосов
/ 22 декабря 2010

Вы можете установить патч Range для добавления метода, который будет вести себя так, как вы хотите. Пример:

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

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

Остерегайтесь обезьяньих патчей, поскольку они изменяют функциональность существующих классов. Возможно, в этом случае есть лучший способ сделать это, но, учитывая вопрос, это приемлемый ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...