Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Arrays 为什么可以';我不能把数字作为字符串变成整数吗?_Arrays_Ruby_String_Integer - Fatal编程技术网

Arrays 为什么可以';我不能把数字作为字符串变成整数吗?

Arrays 为什么可以';我不能把数字作为字符串变成整数吗?,arrays,ruby,string,integer,Arrays,Ruby,String,Integer,我正在做一个kata,它要求我将两个数字字符串(例如“123456”)更改为整数,将这些整数相加,然后确定哪个值更大以打印消息。 以下是我目前掌握的情况: 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}

我正在做一个kata,它要求我将两个数字字符串(例如“123456”)更改为整数,将这些整数相加,然后确定哪个值更大以打印消息。 以下是我目前掌握的情况:

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
def goodVsEvil(善,恶)
goodarr=[]
埃维亚尔=[]
良好的推送(良好的分割(“”)
邪恶之推(邪恶之劈(“”)
再见,每一个{n{n.to{u i}
邪恶的每一个{n{n.to{u i}
goodsum=goodarr.inject(:+)
EVILISUM=evilarr.inject(:+)
如果goodsum>evissum
返回“战斗结果:善战胜恶”
elsif goodsum
我将字符串拆分为单独的数字并将它们放入各自的数组中,但我需要将它们转换为整数,解释器将无法识别
.to\I
方法是有效的方法。
如何修复它或我是如何出错的?

首先
split
返回一个数组。您不需要首先创建它
每个
只在数组中迭代,但不更改其元素。因此,您可以使用
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"

如您所见,这将产生一个嵌套数组。

首先
split
返回一个数组。您不需要首先创建它
每个
只在数组中迭代,但不更改其元素。因此,您可以使用
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.push(good.split(" "))
这和你想象的不一样。在这里,您只向数组中添加一个元素,该数组是调用
split
的结果数组:

goodarr => [["1", "2", "3", "4", "5", "6"]]
这意味着数组中的每个元素都是一个数组,没有
to_i
方法

您应该这样做:

goodarr = good.split(" ")

第二个错误是:

goodarr.each{|n| n.to_i}
这个代码没有任何副作用。块返回的值不会存储在任何位置。你需要使用
map改为:

goodarr.map!{|n| n.to_i}

最后一个错误是使用赋值运算符
=
当您实际想要使用相等运算符比较相等值时,这里至少有三个错误:

goodarr.push(good.split(" "))
这和你想象的不一样。在这里,您只向数组中添加一个元素,该数组是调用
split
的结果数组:

goodarr => [["1", "2", "3", "4", "5", "6"]]
这意味着数组中的每个元素都是一个数组,没有
to_i
方法

您应该这样做:

goodarr = good.split(" ")

第二个错误是:

goodarr.each{|n| n.to_i}
这个代码没有任何副作用。块返回的值不会存储在任何位置。你需要使用
map改为:

goodarr.map!{|n| n.to_i}
最后一个错误是使用赋值运算符
=
,当您实际想要使用相等运算符
=

比较相等值时,让我们将其分解为:

def goodVsEvil(good, evil)
 goodarr = []
 evilarr = []
实际上没有必要“声明”变量

 goodarr.push(good.split(" "))
 evilarr.push(evil.split(" "))
在这里,你将一个数组推入一个数组,因此你最终得到一个元素数组,单个元素就是多元素数组。基本上是这样的:

“123456”变成了
[[1,2,3,4,5,6]
,这不是你想要的。直接赋值
eviarr=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
细分:

  • good.split(/\s+/)
    -使用正则表达式拆分字符串使其接受更脏的输入
  • .map(&:to_i)
    -这将获取上一步的字符串数组,对每个字符串调用“to_i”方法以创建一个整数,然后返回整数数组
  • .inject(0,:+)
    -这将获取整数数组,从0开始,将每个整数相加,返回总和
  • 让我们来分析一下:

    def goodVsEvil(good, evil)
     goodarr = []
     evilarr = []
    
    实际上没有必要“声明”变量

     goodarr.push(good.split(" "))
     evilarr.push(evil.split(" "))
    
    在这里,你将一个数组推入一个数组,因此你最终得到一个元素数组,单个元素就是多元素数组。基本上是这样的:

    “123456”变成了
    [[1,2,3,4,5,6]
    ,这不是你想要的。直接赋值
    eviarr=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
    
    细分:

  • good.split(/\s+/)
    -使用正则表达式拆分字符串使其接受更脏的输入
  • .map(&:to_i)
    -这将获取上一步的字符串数组,对每个字符串调用“to_i”方法以创建一个整数,然后返回整数数组
  • .inject(0,:+)
    -这将获取整数数组,从0开始,将每个整数相加,返回总和

  • 最后一点注意最后一个条件是使用赋值
    =
    而不是等式
    =
    可能与问题无关,但实现这一点的另一种方法是使用正则表达式。例如:good_sum=good.scan(/\d+/).collect(&:to_i)。sum@nkm我的想法是以另一种方式获得总和:
    good_sum=eval(good.gsub(“,”+”)
    也可以。@nkm
    sum
    是一种未在ruby core中实现的
    rails
    方法。您需要使用
    inject
    reduce
    。例如,我会将您的方法更改为
    good.scan(/\d+/).map(&:to_I).reduce(:+)
    ,如果您认为只有两个错误您计算得不好:)最后注意最后一个条件是使用赋值
    =
    而不是相等
    =
    可能与问题无关,但实现同样目标的另一种方法是使用正则表达式。例如:good_sum=good.scan(/\d+/).collect(&:to_i)。sum@nkm我的想法