Неопределенная проблема длины метода - PullRequest
1 голос
/ 03 ноября 2019

Я пытаюсь создать методы для Enumerable#each и Enumerable#map, называемые my_each и my_map.

Но возникает проблема, когда я пытаюсь уступить блоку из my_eachв my_map карте, кто-нибудь может мне помочь?

Когда я заменяю my_each внутри my_map на просто each, он работает

module Enumerable
  def my_each
   return self.to_enum :my_each unless block_given?
       for i in 0..self.length - 1
           yield(self[i])
       end
       return self
  end

   def my_map(proc=nil)
       return_array = Array.new
       return self.to_enum :my_map if !block_given? && proc.nil?
       self.my_each do |i|
           return_array.push(proc.call(i)) unless proc.nil?
           return_array.push(yield(i)) if block_given? && proc.nil?
       end
       return_array
   end
end



array = [1, 2, 3, 4, 5]

puts '*** my_each ***'
array.my_each do |num|
  puts num * num
end

   puts '*** my_map ***'
puts "#{((1..4).my_map { |i| i * i })} "
puts "#{(1..4).my_map.to_a} "
puts "#{([1, 2, 3, 4].my_map { |i| i * i })} "
puts "#{[1, 2, 3, 4].my_map.to_a}\n\n\n"

он должен работать как обычноmap метод, но он бросает мне это:

undefined method `length' for 1..4:Range

1 Ответ

2 голосов
/ 03 ноября 2019

Это потому, что вы вызываете my_each в объекте Range. И, увидев ваш код, в классе Range не определен метод my_each.

Поскольку my_map не вызывает неявно to_a в получателе, то вы используете объект "как есть"в пределах определения my_map в:

def my_map(proc=nil)
  ...
  self.my_each do |i|
    ...
  end
  ...
end

Вы можете преобразовать получатель в массив и избавиться от ошибки:

puts (1..4).to_a.my_map { |i| i * i }
# 1
# 4
# 9
# 16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...