2014-08-27 3 views

ответ

8

#tap метод просто передает объект, на который он был вызван на блок. В конце блока он снова возвращает тот же объект. Таким образом вы можете связать операции или ограничить область переменных.

{}.tap { |h| h[:a] = 1 }.size # => 1 

Вы смогли связать следующий метод с этим блоком. А также избежать создания переменной h в вашей области.

+2

Обратите внимание, что символы 'symbolize_keys' доступны только через Rails, а не в обычном Ruby. Это также кажется излишним в вашем примере, поэтому, возможно, просто перепишите его на 'h [: a] = 1', если вам нужен символ. –

+0

Вы правы, это было ради того, чтобы показать цепочку методов, конечно –

2

tap ничего не делает. Что бы вы ни делали с h в блоке, все, что делается с оригиналом {}.

5

tap особенно полезен, если вы хотите внести некоторые изменения в хэш и после этого вернуть его, например. внутри метода, который возвращает хэш. Преимущество tap состоит в том, что вам не нужно явно возвращать хэш в конце, и нет необходимости в промежуточной переменной.

hash = {} 
hash[:a] = 'b' 
hash 
# => {:a=>"b"} 

против

{}.tap do |hash| 
    hash[:a] = 'b' 
end 
# => {:a=>"b"} 
4

Для Exemple: Вы хотите удалить цепочки, и каждый на хэш.

Вы не можете сделать

hash.delete(:key).each {...} 

но может сделать

hash.tap { |h| h.delete(:key) }.each { ... } 

Это хороший способ цепи ваши методы.

Смежные вопросы