2017-05-03 93 views
-1

我有兩種解決方案可以在Ruby中反轉字符串。一個打印真實而另一個打印錯誤,但是,都打印出我想要的迴應。爲什麼一個解決方案打印真正的其他打印錯誤?

爲什麼有人說它是錯誤的,即使它的結果與打印真實的解決方案的結果相同?

這裏是解決方案和測試:

def reverse(string) 
new = "" 
    i = 0 
    length = string.length 
    while i < length do 
    new = new.to_s + string[-1, 1].to_s 
    string.chop! 
    if i >= string.length 
     break 
    end 
    end 
    puts new 
end 

def secondreverse(string) 
    new = "" 
    i = 0 
    length = string.length 
    while i < length do 
    new = string[i] + new 
    i += 1 
    end 
    return new 
end 

這些測試來檢查代碼工作。寫完你的解決方案之後,他們應該都是正確的。

puts("\nTests for #reverse") 
puts("===============================================") 
    puts(
     'secondreverse("abc") == "cba": ' + (secondreverse("abc") == "cba").to_s 
    ) 
    puts(
     'secondreverse("a") == "a": ' + (secondreverse("a") == "a").to_s 
    ) 
    puts(
     'secondreverse("") == "": ' + (secondreverse("") == "").to_s 
    ) 
puts("===============================================") 
+0

我看到他們所有返回'true'。你得到了什麼? –

+0

使用'new'作爲變量的名稱是一個非常糟糕的主意。它最終會混淆其他任何使用代碼的人,包括你未來的自我。通常,使用更多的描述性名稱,例如'new_str'或者甚至無處不在的'retval'。另外,請注意您使用的值的類型:'new.to_s + string [-1,1] .to_s'在字符串上使用了兩個'to_s',這是冗餘的並浪費了CPU時間。 'string [-1,1]'很尷尬; 'string [-1]'將完成同樣的事情。 –

+0

另外,要小心。你的第一個方法是傳遞傳入的字符串。你沒有看到傳遞一個字符串,但是嘗試傳入一個變量,然後檢查它。因此,如果這是故意的,則應在方法名稱的末尾使用'!'。 –

回答

1

在你#reverse功能,你正在返回puts new時,你應該只被返回new

正如你可以從下面的例子中看到,puts返回nil它輸出到屏幕後:

irb(main): puts 'test' 
test 
=> nil 

如果更改puts new只是new,它像您期望的作品。

除了

你不需要使用顯式調用return。在Ruby中,執行的最後一行將被退回,這樣你就可以在這兩種方法代替這個:

return new 

有:

new 
+0

謝謝! @ The Tin Man 我看到你在說什麼,現在我更好地瞭解在打印到屏幕後puts如何返回nil。 此外,感謝您向我展示如何縮短CPU時間的代碼。 – jafoole

0

的問題是,在reverse方法,正在打印的值使用puts方法輸出stdout,但不返回它(您的方法改爲返回nil)。當您比較nil == "cba"時,它會返回false。你必須返回new變量:

def reverse(string) 
    new = "" 
    i = 0 
    length = string.length 
    while i < length do 
    new = new.to_s + string[-1, 1].to_s 
    string.chop! 
    if i >= string.length 
     break 
    end 
    end 
    new 
end