2016-03-24 86 views
1

我正在做一個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方法作爲一種有效的方法。 我該如何解決這個問題,或者我錯了什麼?

回答

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

最後說明最後一個條件是使用賦值'=',而不是平等''== – engineersmnky

+0

可能不相關到這個問題,但實現相同的另一種方法是使用正則表達式。例如:good_sum = good.scan(/ \ d + /)。collect(&:to_i).sum – nkm

+0

@nkm我的想法是以不同的方式獲得總和:'good_sum = eval(good.gsub(「 「,」+「))'也適用。 – pjd

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"]] 

這將導致一個嵌套的數組,你可以看到。

+0

我認爲你是對的,但它仍然不能識別'.to_i'方法... – animaSonus

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開始,並添加每一個,返回總和。
+0

Hooray指出'if..elsif'條件中的賦值問題。 – engineersmnky

+1

如果你打算做一個代碼審查,不妨全力以赴。 –

+0

你的[codereview.se]帳戶在哪裏? ;-) –

相關問題