valor una rango que por numero multiplicar mismo lee informatica datos como columna celdas celda ruby range

ruby - una - que es un rango de datos en excel



¿Por qué un Rango no funciona al descender? (5)

Esto ni siquiera tiene nada que ver con Ruby, simplemente es matemática básica: el rango que comienza con 5 y termina con 1 está vacío. No hay nada por lo cual iterar.

Esta pregunta ya tiene una respuesta aquí:

¿Por qué (1..5).each sobre 1,2,3,4,5 , pero (5..1) no? Devuelve el Rango en su lugar.

1.9.2p290 :007 > (1..5).each do |i| puts i end 1 2 3 4 5 => 1..5 1.9.2p290 :008 > (5..1).each do |i| puts i end => 5..1


La forma más fácil de hacerlo es usar hasta

5.downto(1) do |i| puts i end


Los rangos usan <=> para determinar si una iteración ha terminado; 5 <=> 1 == 1 (mayor que), por lo que se hace antes de que comience. Incluso si no lo hicieran, los rangos iteran usando succ ; 5.succ es 6 , todavía no tiene suerte. El step un rango no puede ser negativo, por lo que tampoco funcionará.

Devuelve el rango porque each devuelve lo que se llamó. Use downto si es la funcionalidad en sí lo que está buscando, de lo contrario, lo anterior responde su pregunta real sobre "por qué".


Porque Ruby solo hace lo que se le dice, no lo que quieres mean .

No puede decir si quiere ir en reversa (es decir, 5, 4, 3, 2, 1), o si realmente quiere los números empezando desde 5 que son menores o iguales a 1. Es teóricamente posible que alguien Puede que quiera lo último, y como Ruby no puede decir lo que realmente quiere, le irá bien a este último.


Puede extender fácilmente la clase Range , en particular, cada método, para que sea compatible con los rangos ascendentes y descendentes:

class Range def each if self.first < self.last self.to_s=~(//./././) ? last = self.last-1 : last = self.last self.first.upto(last) { |i| yield i} else self.to_s=~(//./././) ? last = self.last+1 : last = self.last self.first.downto(last) { |i| yield i } end end end

Entonces, el siguiente código funcionará exactamente como era de esperar:

(0..10).each { |i| puts i} (0...10).each { |i| puts i} (10..0).each { |i| puts i} (10...0).each { |i| puts i}