Базовая обработка строк в Ruby - PullRequest
0 голосов
/ 02 октября 2009

Дает

idea = gets.reverse
print idea

Если пользователь введет «собаку», то получится «собака»

Но если бы вы сделали этот код ...

idea = gets.reverse!
print idea

Тогда возвращаемая строковая переменная будет 'богом', верно?

Ответы [ 5 ]

7 голосов
/ 02 октября 2009

Почему бы не попробовать это:

irb(main):001:0> idea = gets.reverse
dog
=> "\ngod"
irb(main):002:0> idea = gets.reverse!
dog
=> "\ngod"

Оба вернут обратную строку. Тем не менее:

irb(main):010:0> idea = gets
dog
=> "dog\n"
irb(main):011:0> idea.reverse
=> "\ngod"
irb(main):012:0> idea
=> "dog\n"
irb(main):013:0> idea.reverse!
=> "\ngod"
irb(main):014:0> idea
=> "\ngod"

обратный! изменит текущую строку, в то время как обратный вернет новую.

1 голос
/ 02 октября 2009

reverse возвращает новую перевернутую строку.

s = "hello" 
s1 = s.reverse
puts s , s1 
#=> "hello"
#   "olleh"

reverse! переворачивает текущую строку itslef и возвращает ссылку на нее.

s = "hello" 
s1 = "hello".reverse!
puts s , s1 
#=> "olleh"
#   "olleh"
# Now check that s1 == s2 (Refrerence check)
s1[4] = "k"
puts s , s1
#=> "ollek"
#   "ollek"
1 голос
/ 02 октября 2009

Почему «идея печати»? Методы gets запрашивают у пользователя ввод данных. Никаких других аргументов не требуется.

В этом случае, используете ли вы реверс или реверс! ничего не изменит. Метод reverse переворачивает строку и возвращает перевернутую. Обратное! метод переворачивает строку, возвращает перевернутую и заменяет исходную строку новым значением.

Так что если у вас есть:

 str = "god"
 rst = str.reverse
 p rst + ' ' + str

Он будет отображать "собачьего бога", поскольку только возвращенная строка возвращается, и вы не используете возвращенное значение.

Если у вас есть:

str = "god"
rst = str.reverse!
p rst + ' ' + str

Будет отображаться "собака", как наоборот! Метод переворачивает строку, возвращает ее и изменяет исходную переменную.

0 голосов
/ 02 октября 2009

Я думаю, что вы застряли на этом:

  1. Когда происходит обратное?
  2. Что присваивается переменной idea?

Ключевым моментом является то, что все справа происходит до назначения. Так что если вы связываете несколько методов справа, то то, что присваивается, является конечным результатом цепочки.

Поиграйте с ним немного в irb и посмотрите:

>> input = gets.chomp.reverse
fooboo
=> "ooboof"
>> input = gets.chomp.reverse.upcase
fooboo
=> "OOBOOF"

Что также может сбить вас с толку, так это то, что строковый метод Ruby reverse возвращает обратную строку, но на самом деле он не меняет строку, к которой он обращен. Чтобы изменить саму строку, как уже говорили другие, вам нужен метод reverse!. Это закономерность в языке. (Это может быть getcha, и есть другие подобные ошибки в других языках. Например, sort @array в Perl возвращает обратный массив, но не меняет порядок @array.)

0 голосов
/ 02 октября 2009

Они оба печатают "бог" ИМО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...