【问题标题】:using tap inplace of map and to_h in ruby在 ruby​​ 中使用 tap 代替 map 和 to_h
【发布时间】:2020-11-02 05:41:56
【问题描述】:

假设我有一个函数,它在将用户数据与其 id 映射后返回一个哈希值。 像这样 -

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

如何在此代码块中使用 tap 方法来实现相同的功能?谢谢

【问题讨论】:

  • tap 在这里没有任何意义。为什么你认为会?这是家庭作业吗?
  • 如果我错了请纠正我......这会创建一个数组并创建一个哈希。那就是我想使用 {}.tap 顺便说一句只是想了解我们如何在运行中使用 .tap(我对 ruby​​ 很陌生)
  • 听起来您对#tap 的工作原理不熟悉,您是在寻求解释吗?你的问题真的没有意义。这就像在问,“我如何用餐巾纸做三明治”?当然,三明治店会在您点餐时为您提供两者,但餐巾纸与三明治制作并不真正相关。
  • 这会创建一个键/值对数组(即数组数组),然后使用#to_h 将其转换为单个哈希。你也可以说u_data.each_with_object({}) { |u, h| h[u['id']] = u } 来得到同样的结果。你可以说{}.tap { |h| u_data.each { |u| h[u['id']] = u } },但这只会让阅读代码的人想知道你想做什么以及为什么使用#tap来做这件事。
  • 这就是答案@muistooshort,有很多方法可以通过修改它们的键/值将元素从一个对象映射到另一个对象,而点击就是其中之一。

标签: ruby dictionary hash


【解决方案1】:

如何在此代码块中使用 tap 方法来实现相同的功能?

你不能。在这里使用Object#tap 是没有意义的。

【讨论】:

    【解决方案2】:

    您可以为此使用#tap,但您需要彻底解决问题。你想要一个哈希作为结果,x.tap { ... } 返回 x 所以 x 将是你想要返回的哈希。所以你可以说{}.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
    

    【讨论】:

    • 根据 Ruby 版本,您可以将块传递给 to_h (u_data.to_h { |u| [u['id'], u] })。
    • @SebastianPalma 谢谢你,我一定是错过了对#to_h 的更改或忽略了它,因为我习惯性地去#each_with_object 进行很多这样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2012-12-24
    • 1970-01-01
    相关资源
    最近更新 更多