自定义红宝石注入方法没有产生预期的输出

Posted

技术标签:

【中文标题】自定义红宝石注入方法没有产生预期的输出【英文标题】:custom ruby inject method not producing expected output 【发布时间】:2020-07-12 14:35:08 【问题描述】:

请原谅我,我看到在论坛上以多种方式提出了这个问题,但没有人输出所需的输出,我被困了几天,阅读了关于注入方法如何工作的不同解释。是否可以检查我的代码并查看我做错或缺少的地方或内容?我正在学习语言,不想因为缺乏经验而感到沮丧。

我的代码:


  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,这是因为我使用了检查,但我尝试了其他不起作用的测试用例

【问题讨论】:

_ 除了最后一个返回羊。_ - 为什么“羊”是错误的结果? 没有羊是正确的结果,但它就像跳过它一样,最长不显示任何输出 你从来没有在你的方法中使用sym,这就是为什么只有块形式有效的原​​因。此外,对于(5..10).reduce(:+) :+ 将被解释为第一个参数initial。我不确定实际的 reduce 方法是如何处理这个问题的,但也许它会进行类型检查以查看第一个参数是否是符号? @maxpleaner 我不确定如何为 sym 实现它 我猜我需要检查 initial.nil? && !sym.nil? initial = sym 但是如果没有给定块我将如何实现迭代器.对于reduce,我读过reduceinject 的别名 initial.nil? && !sym.nil? 这不起作用,因为就像我说的那样,:+ 将被解释为initial 的值。相反,您可以使用sym ||= initial if initial.is_a?(Symbol)。至于如何在方法中使用sym,可以acc.send(sym, x) 【参考方案1】:

我能够用代码解决它。

 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

【讨论】:

以上是关于自定义红宝石注入方法没有产生预期的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Nginx 注入自定义内容?

如果没有该pugin的源代码,有什么方法可以注入自定义服务而不是第三方插件的服务

HIVE自定义函数

EZAudio 自定义 AudioStreamBasicDescription 没有按我的预期工作

存储过程未返回预期的自定义异常消息

iPhone:如何为自定义键盘制作按键声音?