Почему Ruby позволяет мне вызывать метод String без указания строки? - PullRequest
7 голосов
/ 03 ноября 2011

Читая Программируя Ruby , я наткнулся на этот фрагмент кода:

while gets
  num1, num2 = split /,/
end

Хотя я интуитивно понимаю, что он делает, я не понимаю синтаксис. «split» - это метод класса String - на языке Ruby, какая строка является получателем сообщения «split» в приведенном выше сценарии?

Я могу видеть в документах, что 'gets' присваивает свой результат переменной $ _, поэтому я предполагаю, что он неявно использует $ _ в качестве получателя - но целая группа поиска в Google не смогла подтвердить это предположение , Если это так, я хотел бы знать, какое общее правило для методов вызывается без явного получателя.

Я попробовал код в irb, добавив некоторые диагностические вызовы, и убедился, что реальное поведение соответствует ожидаемому: num1 и num2 получают назначенные значения, которые были введены через запятую.

Ответы [ 2 ]

6 голосов
/ 03 ноября 2011

Ruby 1.8 имеет метод Kernel#split([pattern [, limit]]), который идентичен $_.split(pattern, limit), а gets устанавливает значение $_.

4 голосов
/ 03 ноября 2011

Вы, в основном, прибили его своим объяснением (по крайней мере для 1.8.7, 1.9.3 дал мне NoMethodError для main), но ИМХО, это ужасный Ruby (или, может быть, кто-то переключается с Perl).Если вы переписываете что-то вроде этого, это становится намного понятнее:

while input = gets.chomp
  num1, num2 = input.split(/,/)
end

Общее правило для вызовов методов без получателя состоит в том, что они отправляются на self, что бы это ни было в текущемконтекст.На верхнем уровне это вышеупомянутый main, циклический перлизм $_, кажется, пропал в 1.9.

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