пользовательский метод ввода ruby не дает ожидаемого результата - PullRequest
0 голосов
/ 01 апреля 2020

прости меня, я вижу, что этот вопрос задавался многими способами здесь на форумах, но ни один из них не дал желаемого результата, и я застрял на несколько дней, читая различные объяснения того, как работает метод инъекции. Может ли мой код быть проверен и виден, где или что я делаю неправильно или отсутствует? Я изучаю язык и не хочу расстраиваться из-за моей неопытности.

мой код:


  def my_inject(initial = nil, sym = nil, &block)
    check = initial.nil?
    acc = check ? 0 : 1


    if block_given?
      my_each { |x| acc = yield(acc, x) }
      end
    acc
  end
alias_method :my_reduce, :my_inject

Я тестировал с тестовыми примерами из ruby_do c .org. контрольные примеры:

# Sum some numbers
(5..10).reduce(:+)                             #=> 45
# Same using a block and inject
(5..10).inject { |sum, n| sum + n }            #=> 45
# Multiply some numbers
(5..10).reduce(1, :*)                          #=> 151200
# Same using a block
(5..10).inject(1) { |product, n| product * n } #=> 151200
# find the longest word
longest = %w{ cat sheep bear }.inject do |memo, word|
   memo.length > word.length ? memo : word
end
longest                                        #=> "sheep"

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

хорошо, вот что у меня сейчас:

  def my_inject(initial = nil, sym = nil, &block)
    acc = initial.nil? ? 0 : 1
    sym ||= initial if initial.is_a? Symbol
    if !block_given?
      block = sym.to_proc
      my_each { |x| acc = block.call(acc, x) }
    else
      my_each { |x| acc = yield(acc, x) }
      end
    acc
  end
  alias_method :my_reduce, :my_inject

это работает с первыми четырьмя тестовыми примерами, но не с 5-м, также первый тестовый пример возвращает 46 вместо 45, что из-за проверки, которую я использовал, но я пробовал другие, которые не работали

1 Ответ

0 голосов
/ 06 апреля 2020

Я смог решить это с помощью кода.

 def my_inject(initial = nil, second = nil)
    arr = is_a?(Array) ? self : to_a
    sym = initial if initial.is_a?(Symbol) || initial.is_a?(String)
    acc = initial if initial.is_a? Integer

    if initial.is_a?(Integer)
      sym = second if second.is_a?(Symbol) || second.is_a?(String)
    end

    if sym
      arr.my_each { |x| acc = acc ? acc.send(sym, x) : x }
    elsif block_given?
      arr.my_each { |x| acc = acc ? yield(acc, x) : x }
    end
    acc
  end
  alias my_reduce my_injec
...