используя тап вместо карты и to_h в ruby - PullRequest
1 голос
/ 13 июля 2020

Предположим, у меня есть функция, которая возвращает ha sh после сопоставления данных пользователя с его идентификатором. Примерно так -

  def user_data(u_data)
    u_data.map { |u| [u['id'], u] }.to_h
  end

Как я могу использовать метод касания с этим блоком кода для тех же функций? Спасибо

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете использовать #tap для этого, но вам нужно вывернуть проблему наизнанку. Вы хотите получить ha sh, а x.tap { ... } возвращает x, поэтому x будет ha sh, которое вы хотите вернуть. Таким образом, вы можете сказать {}.tap { |h| ... } и позволить блоку заполнить h желаемым форматом:

def user_data(u_data)
  {}.tap do |h|
    u_data.each do |u|
      h[u['id']] = u
    end
  end
end

Это довольно неприятно, и я надеюсь, что никто не сделает это в реальном коде.

Лучше использовать текущий подход #to_h или, возможно, использовать #each_with_object:

def user_data(u_data)
  u_data.each_with_object({}) { |u, h| h[u['id']] = u }
end

или, что ближе к исходному, [#to_h ] [2] с блоком:

def user_data(u_data)
  u_data.to_h { |u| [u['id'], u] }
end
1 голос
/ 13 июля 2020

Как я могу использовать метод касания с этим блоком кода для тех же функций?

Вы не можете. Здесь нет смысла использовать Object#tap.

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