自定义 ruby 注入方法未产生预期输出
custom ruby inject method not producing expected output
原谅我,我看到这个问题已经在论坛上以多种方式被问到,但是 none 已经输出了所需的输出,我已经被困了几天阅读关于注入方法如何工作的不同解释.是否可以检查我的代码并查看我在哪里或哪里做错了或缺少什么?我正在学习这门语言,不想因为我的经验不足而感到沮丧。
我的代码:
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"
我的代码适用于除最后一个 returns 绵羊之外的所有块。
非常感谢深入了解我做错了什么。
好的,这就是我现在拥有的:
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 个,也是第一个测试用例 returns 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
原谅我,我看到这个问题已经在论坛上以多种方式被问到,但是 none 已经输出了所需的输出,我已经被困了几天阅读关于注入方法如何工作的不同解释.是否可以检查我的代码并查看我在哪里或哪里做错了或缺少什么?我正在学习这门语言,不想因为我的经验不足而感到沮丧。
我的代码:
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"
我的代码适用于除最后一个 returns 绵羊之外的所有块。 非常感谢深入了解我做错了什么。
好的,这就是我现在拥有的:
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 个,也是第一个测试用例 returns 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