为什么我不能将数字作为字符串更改为整数?

时间:2016-03-24 12:54:26

标签: arrays ruby string integer

我正在做一个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方法识别为有效方法。 我如何解决它或我怎么错?

3 个答案:

答案 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

打破它:

  1. good.split(/\s+/) - 使用正则表达式拆分字符串使其接受更脏的输入。
  2. .map(&:to_i) - 这将从最后一步获取字符串数组,在每个上调用“to_i”方法创建一个整数,然后返回整数数组。
  3. .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"]]

如您所见,这会产生嵌套数组。