【问题标题】:How to pass array as individual arguments in ruby?如何在 ruby​​ 中将数组作为单个参数传递?
【发布时间】:2021-06-02 17:01:49
【问题描述】:

我正在尝试一种更优雅的方式将数组元素作为单独的参数传递给方法。

到目前为止,我有以下代码:

def fetch_data(keywords)
  Product.where("name ILIKE ? AND type ILIKE ?", *construct_keywords(keywords))
end

def construct_keywords(keywords)
  keywords.map{ |keyword| "%#{keyword}%" }
end

这很好用,而且我知道 splat 运算符做得很好,但我想看看是否可以不使用那个丑陋的星号,而是可以以某种方式重塑 construct_keywords 的返回值,以便fetch_data 方法将数组元素识别为单独的参数。所以最终我希望它是这样的:

def fetch_data(keywords)
  Product.where("name ILIKE ? AND type ILIKE ?", construct_keywords(keywords))
end

def construct_keywords(keywords)
  keywords.map{ |keyword| "%#{keyword}%" }
  # reshape above array in a way so that fetch_data will recognize each elements as arguments
end

提前谢谢你。

【问题讨论】:

    标签: arrays ruby refactoring splat


    【解决方案1】:

    虽然这可能很方便,但无法直接告知您的返回值将如何使用并“预先分配”。这是被调用的方法必须实现的东西。

    您可能想探索使用基于关键字的占位符,例如 name ILIKE :name,然后您可以在其中创建匹配的哈希。

    现在,您将任意数量的keywords 传递给返回任意大小的结果数组的方法,然后该数组将绑定到恰好具有两个位置的查询。这似乎很容易失败。

    使用[ :name, :type ].zip(keywords.map { ... }).to_h 会给你一些可以插入其中的东西,当然,假设你有两个关键字参数。

    虽然可能需要进行一些重构,但真正难以混淆的表单如下所示:

    def fetch_data(name:, type:)
      Product.where("name ILIKE :name AND type ILIKE :type", name: name, type: type)
    end
    

    必须指定那些关键字参数的位置,并且只能有两个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2014-01-12
      • 2010-10-24
      • 2015-09-15
      • 2010-10-01
      • 2013-08-10
      • 1970-01-01
      相关资源
      最近更新 更多