2014-11-06 2 views
2

Я не понимаю, почему reverseed_string = string [i] + reverseed_string сначала помещает последний char. Кажется, что строка [i] будет индексировать первый символ, а не последний. Поэтому, если строка была «abc», индекс 0 был бы «a», а не «c». Может кто-нибудь объяснить, как ruby ​​получает «c» из индекса 0? А потом, конечно, «b» из индекса 1? Etc и т. Д.Метод 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" .реверсный! => "gfedcba" – scottxu

+2

@scottxu Я думаю, что этот вопрос предназначен для практического программирования путем написания метода, который меняет строку. – David

ответ

5
reversed_string = string[i] + reversed_string 

Например, если string является "abc", string[0] действительно "a", но здесь он должен быть помещен в начиная из reversed_string, а не конец. reversed_string добавляется в каждой итерации как:

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

Предполагая, что вы не можете использовать рубин Class Строка встроенный в Обратный метод, вы можете попробовать следующее

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

Вы используете встроенные методы. 'push' и' length', например. – vgoff

0

Как вы знаете, существует способ String#reverse для изменения строки. Я понимаю, что вы не должны использовать этот метод, но вместо этого напишите свой собственный, где аргумент метода - это строка, подлежащая изменению. Другие будут предлагать вам способы сделать это.

Как вы новичок в Ruby, я думал, что это может оказаться полезным, чтобы показать вам, как вы могли бы написать новый метод для String класса, скажем, String#my_reverse, что ведет себя точно так же, как и String#reverse. Тогда для строки "three blind mice", мы имеем:

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

Чтобы создать метод без аргументов для класса строк, мы обычно делаем это следующим образом:

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'.

Смежные вопросы