我正在做一个kata,要求我改变两个数字串(例如" 1 2 3 4 5 6"例如)到整数,添加那些整数,然后确定哪个打印出一条消息的值越大。 这就是我到目前为止所拥有的:
def goodVsEvil(good, evil)
goodarr = []
evilarr = []
goodarr.push(good.split(" "))
evilarr.push(evil.split(" "))
goodarr.each{|n| n.to_i}
evilarr.each{|n| n.to_i}
goodsum = goodarr.inject(:+)
evilsum = evilarr.inject(:+)
if goodsum > evilsum
return "Battle Result: Good triumphs over Evil"
elsif goodsum < evilsum
return "Battle Result: Evil eradicates all trace of Good"
elsif goodsum = evilsum
return "Battle Result: No victor on this battle field"
end
end
我将字符串拆分为单独的数字并将它们推入各自的数组中,但我需要将它们转换为整数,并且解释器不会将.to_i
方法识别为有效方法。
我如何解决它或我怎么错?
答案 0 :(得分:6)
这里至少有三个错误:
goodarr.push(good.split(" "))
这不符合你的想法。在这里,您只需向数组添加一个元素,该数组是调用split
的结果数组:
goodarr => [["1", "2", "3", "4", "5", "6"]]
这意味着数组中的每个元素都是一个没有to_i
方法的数组。
你应该这样做:
goodarr = good.split(" ")
或
goodarr = good.split # use spaces by default
第二个错误是:
goodarr.each{|n| n.to_i}
此代码完全没有副作用。块返回的值不会存储在任何位置。您需要使用map!
代替:
goodarr.map!{|n| n.to_i}
当你真的想要使用等于运算符=
比较值相等时,最后一个错误是使用赋值运算符==
。
答案 1 :(得分:2)
让我们打破这个:
def goodVsEvil(good, evil)
goodarr = []
evilarr = []
确实没有必要“声明”你的变量。
goodarr.push(good.split(" "))
evilarr.push(evil.split(" "))
你在这里将一个数组推入一个数组,所以最终得到一个单元素数组,单个元素是一个多元素数组。基本上就是这样:
“1 2 3 4 5 6”变成[[1,2,3,4,5,6]]
,这不是你想要的。直接分配evilarr=evil.split(" ")
就是您想要的。
goodarr.each{|n| n.to_i}
evilarr.each{|n| n.to_i}
这些行什么都不做。这不会影响每个数组。
goodsum = goodarr.inject(:+)
evilsum = evilarr.inject(:+)
所有这些问题最终都无法解决。
if goodsum > evilsum
return "Battle Result: Good triumphs over Evil"
elsif goodsum < evilsum
return "Battle Result: Evil eradicates all trace of Good"
elsif goodsum = evilsum
return "Battle Result: No victor on this battle field"
end
end
此代码的作用除goodsum = evilsum
外。一个“=”是赋值,“==”是比较。
这就是我要做的事情:
def goodVsEvil(good,evil)
goodsum = good.split(/\s+/).map(&:to_i).inject(0, :+)
evilsum = evil.split(/\s+/).map(&:to_i).inject(0, :+)
if goodsum > evilsum
return "Battle Result: Good triumphs over Evil"
elsif goodsum < evilsum
return "Battle Result: Evil eradicates all trace of Good"
elsif goodsum == evilsum
return "Battle Result: No victor on this battle field"
end
end
打破它:
good.split(/\s+/)
- 使用正则表达式拆分字符串使其接受更脏的输入。.map(&:to_i)
- 这将从最后一步获取字符串数组,在每个上调用“to_i”方法创建一个整数,然后返回整数数组。.inject(0, :+)
- 这将获取整数数组,从0开始并添加每个整数,返回总和。答案 2 :(得分:1)
首先split
返回一个数组。您最初不需要创建它。 each
仅迭代数组,但不会更改其元素。因此,您可以使用map
。
def goodVsEvil(good, evil)
goodarr = good.split(" ").map{|n| n.to_i}
evilarr = evil.split(" ").map{|n| n.to_i}
goodsum = goodarr.inject(:+)
evilsum = evilarr.inject(:+)
if goodsum > evilsum
return "Battle Result: Good triumphs over Evil"
elsif goodsum < evilsum
return "Battle Result: Evil eradicates all trace of Good"
elsif goodsum = evilsum
return "Battle Result: No victor on this battle field"
end
end
goodVsEvil("1 2 3 4 5 6", "1 2 3 4 5 6 7")
# => "Battle Result: Evil eradicates all trace of Good"
你试过了:
goodarr = []
goodarr.push(good.split(" "))
# => [["1", "2", "3", "4", "5", "6"]]
如您所见,这会产生嵌套数组。