Arrays 为什么可以';我不能把数字作为字符串变成整数吗?
我正在做一个kata,它要求我将两个数字字符串(例如“123456”)更改为整数,将这些整数相加,然后确定哪个值更大以打印消息。 以下是我目前掌握的情况: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}
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(“,”+”)
也可以。@nkmsum
是一种未在ruby core中实现的rails
方法。您需要使用inject
或reduce
。例如,我会将您的方法更改为good.scan(/\d+/).map(&:to_I).reduce(:+)
,如果您认为只有两个错误您计算得不好:)最后注意最后一个条件是使用赋值=
而不是相等=
可能与问题无关,但实现同样目标的另一种方法是使用正则表达式。例如:good_sum=good.scan(/\d+/).collect(&:to_i)。sum@nkm我的想法