2014-11-06 76 views
2

我不明白爲什麼reverse_string = string [i] + reversed_string首先放置最後一個字符。看起來string [i]會索引第一個字符而不是最後一個字符。所以如果字符串是「abc」,索引0將是'a'而不是'c'。有人能解釋一下ruby如何從索引0得到'c'嗎?那麼,當然,索引1中的'b'?等等Ruby方法反轉字符串輸入

編寫一個方法,將一個字符串作爲輸入,並以相反的順序返回一個相同字母的新字符串。

難度:容易。

def reverse(string) 
    reversed_string = "" 

    i = 0 
    while i < string.length 
    reversed_string = string[i] + reversed_string 

    i += 1 
    end 

    return reversed_string 
end 
puts("reverse(\"abc\") == \"cba\": #{reverse("abc") == "cba"}") 
puts("reverse(\"a\") == \"a\": #{reverse("a") == "a"}") 
puts("reverse(\"\") == \"\": #{reverse("") == ""}") 
+0

「abcdefg」.reverse! =>「gfedcba」 – scottxu 2014-11-06 02:11:40

+2

@scottxu我認爲這個問題旨在通過編寫一個反轉字符串的方法來練習編程。 – David 2014-11-06 02:18:58

回答

5
reversed_string = string[i] + reversed_string 

例如,如果string是​​,string[0]的確"a",但在這裏,它被放置在開始的reversed_string,而不是終點。 reversed_string在每次迭代加起來爲:

"a" + ""  #string[0] + "" => "a" 
"b" + "a" #string[1] + "a" => "ba" 
"c" + "ba" #string[2] + "ba"=> "cba" 
0

假設你不能使用Ruby類字符串的內置反向方法,你可以嘗試以下

def reverse_string(string) 
    new_string = [] 
    i = string.length-1 
    while i >= 0 
    new_string.push(string[i]) 
    i -= 1 
    end 
    new_string.join 
end 

這將創建一個新的字符串對象,但它會反轉字符串而不使用任何內置方法。

+0

您正在使用內置方法。例如,「推」和「長度」。 – vgoff 2014-11-06 03:42:44

0

正如你所知,有一個方法String#reverse來反轉一個字符串。我知道你不應該使用這種方法,而應該編寫你自己的方法,其中方法的參數是要被顛倒的字符串。其他人會建議你可能會這樣做的方式。

當你是新的紅寶石,我想這可能是有益的告訴你如何可以寫一個新的方法爲String類,比如說,String#my_reverse,其行爲完全一樣String#reverse。那麼對於字符串"three blind mice",我們將有:

"three blind mice".reverse #=> "ecim dnilb eerht" 
"three blind mice".my_reverse #=> "ecim dnilb eerht" 

爲了不String類參數創建一個方法,我們通常像這樣做:

class String 
    def my_method 
    ... 
    end 
end 

我們調用my_method通過發送它接收器是String類的一個實例。例如,如果寫:

"three blind mice".my_method 

我們發送的方法String#my_method到接收器"three blind mice"。在該方法的定義中,接收器被稱爲self。這裏self將是"three blind mice"。同樣,正如該字符串的第二個字符(在偏移量1處)是"three blind mice"[1] #=> "h",self[1] #=> "h"。我們可以檢查:

class String 
    def my_method 
    puts "I is '#{self}'" 
    (0...self.size).each { |i| puts self[i] } 
    end 
end 

"three blind mice".my_method 

將打印:

I is 'three blind mice' 
t 
h 
r 
e 
e 

b 
... 
c 
e 

方法my_reverse幾乎是相同的:

class String 
    def my_reverse 
    sz = self.size 
    str = '' 
    (0...sz).each { |i| str << self[sz-1-i] } 
    str 
    end 
end 

"three blind mice".my_reverse 
    #=> "ecim dnilb eerht" 

你能想到的self作爲其值的變量就是接收器,但與變量不同,您不能將自我重新分配給不同的對象。例如,我們可以寫x = 1; x = 'cat',但我們不能寫self = 'cat'。然而,正如我們已經看到的那樣,我們可以改變自己對其他對象的引用,例如self[1] = 'r'