Tengo dos sugerencias para usted, no son muy ideales, pero son lo mejor que se me ocurre.
Primero puede definir un nuevo método en la clase Range que hace lo que describe. Se vería así:
class Range
def have?(x)
if x == self.begin
false
else
include?(x)
end
end
end
p (0..10).have?(0) #=> false
p (0..10).have?(0.00001) #=> true
No sé, acabo de utilizar un sinónimo de "incluir" como un nombre de método, tal vez usted puede pensar en algo mejor. Pero esa es la idea.
Y luego podría hacer algo un poco más elaborado y definir un método en la clase Range que marque un rango como aquel para excluir el valor inicial, y luego cambiar el método include?
de Range para verificar esa marca.
class Range
def exclude_begin
@exclude_begin = true
self
end
alias_method :original_include?, :include?
def include?(x)
return false if x == self.begin && instance_variable_defined?(:@exclude_begin)
original_include?(x)
end
alias_method :===, :include?
alias_method :member?, :include?
end
p (0..10).include?(0) #=> true
p (0..10).include?(0.00001) #=> true
p (0..10).exclude_begin.include?(0) #=> false
p (0..10).exclude_begin.include?(0.00001) #=> true
Una vez más, es posible que desee una mejor (más elegante?) Nombre para el método de exclude_begin
, Acabo de elegir que, dado que es consistente con el método de rango exclude_end?
.
Edit: Tengo otra para ti, solo porque encuentro este problema tan interesante. : P Esto sólo va a trabajar en la última versión de Ruby 1.9, pero permitirá la siguiente sintaxis:
(0.exclude..10).include? 0 #=> false
(0.exclude..10).include? 0.00001 #=> true
Se utiliza la misma idea que mi segunda sugerencia, pero almacena el "marcador de exclusión" en el número en lugar del rango Tengo que usar SimpleDelegator de Ruby 1.9 para lograr esto (los números en sí mismos no pueden tener variables de instancia ni nada), por lo que no funcionará en las versiones anteriores de Ruby.
Creo que excluir el último valor suele ser muy útil, como 'rango = 0 ... algo.size' ¿Cuál es su uso para la necesidad de excluir el primer valor? –
Compruebo si un determinado conjunto de valores está dentro de ese rango. Solo quiero manejar valores cero de manera diferente. Sé cómo lograr esto, pero tenía curiosidad, si hay algo similar como '...' para excluir el * primer * valor de un rango. –
Aprendí más sobre el alcance en 5 minutos que en el último año. ¡Gracias! –