2014-11-06 73 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'