gpt4 book ai didi

ruby - 如何消除代码中不相关的输出?

转载 作者:行者123 更新时间:2023-12-02 02:13:50 28 4
gpt4 key购买 nike

这是我到目前为止的代码:

class Integer
def atm
money = %w[e500 e200 e100 e50 e20 e10 e5]
return '' if self == 0
money.each do |m|
value = m.split('e').last.to_i
next if self.to_f / value < 1.0
anm = self / value
erg = ("e" + value.to_s)
return money << {erg => anm}, (self-anm*value).atm
end
end
end

puts 140.atm

它给出了这个输出:

e500e200e100e50e20e10e5{“e100”=>1}e500e200e100e50e20e10e5{“e20”=>2}

但我只想要这个:

[{ "e100" => 1 },{ "e20" => 2 }]

如何消除其余部分?

最佳答案

您可以通过删除 money << 来获得所需的输出来自您的return声明,即:

return {erg => anm}, (self-anm*value).atm

这给出:

puts 140.atm
{"e100"=>1}
{"e20"=>2}

但是,puts隐藏了这样一个事实:结果实际上是一个带有空字符串的嵌套数组:

p 140.atm
[{"e100"=>1}, [{"e20"=>2}, ""]]

要解决此问题,您可以返回 nil如果self0 :

return nil if self == 0

# or simply

return if self == 0

并使用 splat 运算符 *return 的第二个元素上“展平”返回值:

return {erg => anm}, *(self-anm*value).atm
# ^

这给出:

p 140.atm
[{"e100"=>1}, {"e20"=>2}]

另一种选择是避免递归并在循环内收集结果,例如:

def atm
money = %w[e500 e200 e100 e50 e20 e10 e5]

i = self
money.each_with_object([]) do |m, result|
value = m.split('e').last.to_i
anm, i = i.divmod(value)
result << { m => anm } if anm > 0
end
end

我正在使用divmod这里一次性计算商和余数(实际上是模数)。它的工作原理如下:

140.divmod(500) #=> [0, 140]
140.divmod(200) #=> [0, 140]
140.divmod(100) #=> [1, 40]
40.divmod( 50) #=> [0, 40]
40.divmod( 20) #=> [2, 0]

结果的第一个元素决定参数“适合”接收者的次数。它的第二个元素是余数,它也成为新的左侧值。

例如:

140.divmod(100) #=> [1,  40]
# means: 140 = 100 * 1 + 40

关于ruby - 如何消除代码中不相关的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67400955/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com