自定义红宝石注入方法无法产生预期的输出结果

问题描述 投票:-1回答:1

原谅我,我已经在论坛上以许多方式询问了这个问题,但是没有一个输出期望的结果,我被困了几天,阅读了有关注入方法工作原理的不同解释。是否可以检查我的代码并查看我做错或缺少的地方或内容?我正在学习语言,不想因自己的经验而感到沮丧。

我的代码:


  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_doc.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

它适用于前四个测试用例,但不适用于第五个测试用例,而且第一个测试用例返回46而不是45,这是因为我使用了检查,但是我尝试了其他无效的检查]

原谅我,我已经在论坛上以许多方式询问了这个问题,但没有一个输出期望的结果,我被困了几天,阅读了关于...

ruby inject enumerable
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.