как реализовать функцию для перебора, если она прошла Range - PullRequest
1 голос
/ 24 марта 2020

Я создаю свою собственную версию метода .each в Ruby, и у меня возникают проблемы с ее реализацией для ввода значений Range (1..10).

module Enumerable
  # @return [Enumerable]
  def my_each
    return to_enum :my_each unless block_given?

    index = 0
    while index < size
      if is_a? Array
        yield self[index]
      elsif is_a? Hash
        yield keys[index], self[keys[index]]
      elsif is_a? Range
        yield self[index]
      end
      index += 1
    end
  end
end

Я пытаюсь получить его, если передано

r_list = (1..10)
r_list.my_each { |number| puts number }

Выход будет

=> 
1
2
3
4
5
6
7
8
9
10

1 Ответ

1 голос
/ 25 марта 2020

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

module Enumerable
  def my_each
    return to_enum :my_each unless block_given?

    index = 0
    while index < size
      if is_a? Array
        yield self[index]
      elsif is_a? Hash
        yield keys[index], self[keys[index]]
      elsif is_a? Range
        yield to_a[index]
      end
      index += 1
    end
  end
end

r_list = (1..10)
puts r_list.my_each { |number| puts number }

Результат:

1
2
3
4
5
6
7
8
9
10
...