Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义ruby注入方法未生成预期输出_Ruby_Inject_Enumerable - Fatal编程技术网

自定义ruby注入方法未生成预期输出

自定义ruby注入方法未生成预期输出,ruby,inject,enumerable,Ruby,Inject,Enumerable,请原谅,我看到论坛上有人以多种方式问过这个问题,但都没有输出所需的输出,我被困了几天,阅读了关于注入方法工作原理的不同解释。我的代码是否可以被检查和查看,我在哪里或哪里做错了或缺少了什么?我正在学习这门语言,不想因为缺乏经验而感到沮丧 我的代码: def my_inject(initial = nil, sym = nil, &block) check = initial.nil? acc = check ? 0 : 1 if block_given?

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

我的代码:


  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"
我的代码适用于除最后一个返回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,这是因为我使用了检查,但我尝试了其他不起作用的测试用例

我能够用代码解决它

 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

_除了最后一个返回sheep的结果外。\为什么“sheep”是错误的结果?没有sheep是正确的结果,但它好像跳过了它,它不会显示任何输出。如果您在方法中从未使用过
sym
,这就是为什么只有块形式有效。另外,使用
(5..10).reduce(:+)
时,
:+
将被解释为第一个参数
initial
。我不确定实际的
reduce
方法如何处理这个问题,但可能它会进行类型检查,以查看第一个参数是否是符号?@maxpleaner我不确定如何为'sym'实现它,我猜我需要检查
initial.nil?&!sym.nil?
initial=sym
但是如果没有给定块,我如何实现迭代器呢。对于
reduce
,从我读到的
reduce
inject
initial.nil?&&&!sym.nil?
这行不通,因为就像我说的那样,
:+
将被解释为
initial
的值。相反,您可以使用
sym | |=initial,如果initial.is|a?(Symbol)
。关于如何在方法中使用
sym
,您可以执行
acc.send(sym,x)