Я читал о том, что водопроводная делает в Ruby, но я запутался в блоке кода ниже,, что рубин водопроводная делает метод на {}
{}.tap do |h|
# some hash processing
end
любая помощь будет принята с благодарностью.
Я читал о том, что водопроводная делает в Ruby, но я запутался в блоке кода ниже,, что рубин водопроводная делает метод на {}
{}.tap do |h|
# some hash processing
end
любая помощь будет принята с благодарностью.
#tap
метод просто передает объект, на который он был вызван на блок. В конце блока он снова возвращает тот же объект. Таким образом вы можете связать операции или ограничить область переменных.
{}.tap { |h| h[:a] = 1 }.size # => 1
Вы смогли связать следующий метод с этим блоком. А также избежать создания переменной h
в вашей области.
tap
ничего не делает. Что бы вы ни делали с h
в блоке, все, что делается с оригиналом {}
.
tap
особенно полезен, если вы хотите внести некоторые изменения в хэш и после этого вернуть его, например. внутри метода, который возвращает хэш. Преимущество tap
состоит в том, что вам не нужно явно возвращать хэш в конце, и нет необходимости в промежуточной переменной.
hash = {}
hash[:a] = 'b'
hash
# => {:a=>"b"}
против
{}.tap do |hash|
hash[:a] = 'b'
end
# => {:a=>"b"}
Для Exemple: Вы хотите удалить цепочки, и каждый на хэш.
Вы не можете сделать
hash.delete(:key).each {...}
но может сделать
hash.tap { |h| h.delete(:key) }.each { ... }
Это хороший способ цепи ваши методы.
Обратите внимание, что символы 'symbolize_keys' доступны только через Rails, а не в обычном Ruby. Это также кажется излишним в вашем примере, поэтому, возможно, просто перепишите его на 'h [: a] = 1', если вам нужен символ. –
Вы правы, это было ради того, чтобы показать цепочку методов, конечно –