Как вы знаете, существует способ 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'
.
"abcdefg" .реверсный! => "gfedcba" – scottxu
@scottxu Я думаю, что этот вопрос предназначен для практического программирования путем написания метода, который меняет строку. – David