Метод «tap» на объекте String не возвращает ожидаемый результат - PullRequest
12 голосов
/ 26 августа 2009

Я столкнулся с интересной проблемой при использовании метода «tap» для объектов типа «String».

"abc".tap { |o| o = "xyz" } # this line returns "abc" instead of "xyz"

Метод «tap» работает с объектами других типов.

[].tap { |o| o << "xyz" } # this line returns ["xyz"] as expected

Я использую Rails 2.3.2 и Ruby 1.8.6 в Windows XP.

Что мне здесь не хватает?

Обновление 1: я решил эту проблему. Это была ошибка использования с моей стороны. В первом сценарии я переназначал значение параметру блока вместо его изменения. Мне удалось переписать код и получить ожидаемый результат.

"abc".tap { |o| o.replace "xyz" }

Обновление 2: код, используемый здесь, просто для демонстрации проблемы. Мой реальный код не выглядит так.

1 Ответ

8 голосов
/ 26 августа 2009

Object # tap всегда возвращает исходный объект, переданный в него после выполнения блока, даже если блок возвращает что-то другое.

Преимущество здесь в том, что вы можете поместить метку в середину цепочки и проверить значение объекта, не изменяя первоначальное значение.

Это означает, что если вы передадите «abc» в tap, он выполнит блок и вернет «abc». Ваше назначение o ничего не значит из-за ограниченности. Аналогично, если вы передадите пустой массив в tap, он вернет пустой массив обратно. Однако во втором примере вы изменили исходное значение. Операции, которые изменяют оригинал, такие как << или gsub! или аналогичным образом изменит объект до его возвращения, поэтому вы получите другое значение обратно. </p>

Проверьте http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions, чтобы найти еще несколько интересных примеров использования tap. Не используйте его для назначения или изменения, иначе вы получите удивительные результаты.

Обновление: для вашего редактирования, почему это решает вашу проблему? Я не понимаю, почему вы вызываете tap для замены, когда вы можете просто вызвать replace для самого объекта. Какая выгода от использования крана?

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