Почему >> не добавляются строки в Ruby? - PullRequest
18 голосов
/ 28 марта 2011

В ruby ​​вы можете добавлять строки, используя <<:

>> "Hello" << "World"
=> "HelloWorld"

Так почему вы не можете добавить их с помощью >>?

>> "Hello" >> "World"
NoMethodError: undefined method `>>' for "Hello":String

Я понимаю, String не имеет определенного метода >>, но что за этим стоит?

Ответы [ 5 ]

24 голосов
/ 06 мая 2012

В Ruby 1.9.3 добавлен метод предварительной строки String #.

Предложение о добавлении prepend [1] также включало метод ">>", и в этой ветке обсуждается кое-что о [2]:

Мац говорит: «>> Интересно, что обозначения не думали об этом.»

Соря говорит: «Этот патч вышел, он несколько раз обсуждался с IRC»

Однако в конце цепочки был сделан вывод о том, что String # prepend и что «другие предложения, включая String # >>, ожидают рассмотрения».

Я не мог найти другие обсуждения по этому поводу, хотя ... кто-нибудь еще?

Лично мне это нравится, и добавить тривиально:

class String
  def >> (s)
    s.prepend(self)
  end
end

Результат:

>> "Hello" >> "World"
=> "HelloWorld"

[1] http://bugs.ruby -lang.org / Issues / 3675

[2] http://translate.google.com/translate?hl=en&sl=ja&tl=en&u=http%3A%2F%2Fbugs.ruby-lang.org%2Fissues%2F3675

19 голосов
/ 28 марта 2011

Синтаксис Ruby не позволяет реализовать метод, подобный >>, так, как вы ожидаете.

<< в "Hello" << "World" эквивалентно следующему:

"Hello".<<("World")

Если вы хотите создать метод prepend >>, я бы ожидал, что «Hello» в "Hello" >> "World" будет аргументом для строки "World":

("Hello")>>."World", котораянедопустимый синтаксис Ruby.

Если бы «World» был аргументом для «Hello», то вы просто добавили бы строку, как продемонстрировано fl00r.Если псевдоним >> будет означать то же, что и <<, это приведет к путанице.

Вот почему вместо этого у вас есть метод insert.Если вы хотите вставить «Hello» перед «World», вы бы назвали insert для «World»:

"World".insert(0, "Hello ")

Здесь необходимо помнить, что <<это вызов метода, подобный строковому методу, например length, поэтому вы должны сохранять порядок, аналогичный обычным вызовам методов.

6 голосов
/ 28 марта 2011

Ruby всегда присваивает значение справа налево.

Но вы можете реализовать это самостоятельно

class String
  def >>(s)
    s << self
  end
end

"Hello" >> "world"
#=> "worldHello"
1 голос
/ 22 февраля 2012

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

class String
  def prepend(string)
    insert(0, string)
  end
end

Я не думаю, что >> хорошая идея, причина, по которой << хорошаяпотому что похоже, что произойдет.>> похоже, что он будет иметь тот же результат, что и << для меня, за исключением того, что вызывающий объект добавляется к параметру.

0 голосов
/ 29 марта 2011

Я думаю, что это хороший вопрос, и проблема носит более общий характер, чем просто проблема с обозначением <<, как предлагается в ответе Макстретча, потому что такая же ситуация с методами, приведенными в алфавите.А именно, существует String#concat, к которому добавляет строку аргумента к self, но нет метода, добавляющего строку аргумента.

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