Я хотел бы объяснить поведение в Ruby, с которым я столкнулся в Коанах - PullRequest
7 голосов
/ 02 февраля 2012

Так это просто оператор лопатки, который изменяет исходную строку? Почему это работает, это выглядит так:

hi = original_string

действует как своего рода указатель? Могу ли я получить некоторое представление о том, когда, как и почему это ведет себя так?

  def test_the_shovel_operator_modifies_the_original_string
    original_string = "Hello, "
    hi = original_string
    there = "World"
    hi << there
    assert_equal "Hello, World", original_string

    # THINK ABOUT IT:
    #
    # Ruby programmers tend to favor the shovel operator (<<) over the
    # plus equals operator (+=) when building up strings.  Why?
  end

Ответы [ 3 ]

9 голосов
/ 02 февраля 2012

В ruby ​​все ссылки.Если вы делаете foo = bar, теперь foo и bar являются двумя именами для одного и того же объекта.

Если, однако, вы делаете foo = foo + bar (или, что эквивалентно, foo += bar), foo теперь ссылается на новый объект: тот, который является результатом вычисления foo + bar.

3 голосов
/ 02 февраля 2012

действует как своего рода указатель

Это называется ссылочная семантика . Как и в Python, переменные Ruby ссылаются на значения, а не содержат их. Это нормально для языков с динамической типизацией, так как гораздо проще реализовать логику «значения имеют тип, переменные нет», когда переменная всегда является просто ссылкой, а не чем-то, что должно волшебным образом изменять размер для хранения значений различных типов.

Что касается фактического коана, см. Почему оператор лопатой (<<) предпочтительнее, чем плюс-равно (+ =) при построении строки в Ruby? </a>.

2 голосов
/ 02 февраля 2012

Строка - это просто последовательность символов, оператор << позволяет вам добавить больше символов в эту последовательность.В некоторых языках есть неизменяемые строки, например в Java и C #, в других есть изменяемые строки, например в C ++, в этом нет ничего плохого, это просто то, что разработчики языка посчитали необходимым. </p>

В Java, когда выЧтобы создать большую строку путем слияния множества строк меньшего размера, вы сначала должны использовать StringBuilder, а затем в конце создать из него реальную строку.В Ruby вы можете просто продолжать использовать << </strong>, чтобы добавить больше символов в эту строку, и все.

Основное отличие состоит в том, что использование << </strong> намного быстреечем "one_string + other_string", потому что оператор + генерирует новую строку вместо добавления к one_string .

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