我想为"按功能查找"创建一系列方法.我不想一遍又一遍地写同样的东西,所以我想使用元编程.

假设我想创建一个按名称查找的方法,接受名称作为参数.我该怎么做?我过go 使用过define_方法,但我没有任何参数支持该方法.

["name", "brand"].each do |attribute|
    define_method("self.find_by_#{attribute}") do |attr_|
      all.each do |prod|
        return prod if prod.attr_ == attr_
      end
    end
  end

有什么 idea 吗?提前谢谢.

推荐答案

如果我没弄错你的问题,你想要这样的东西:

class Product
  class << self
    [:name, :brand].each do |attribute|
      define_method :"find_by_#{attribute}" do |value|
        all.find {|prod| prod.public_send(attribute) == value }
      end
    end
  end
end

(我假设all方法返回一个可枚举的.)

以上内容大致相当于定义两个类方法,如下所示:

class Product
  def self.find_by_name(value)
    all.find {|prod| prod.name == value }
  end

  def self.find_by_brand(value)
    all.find {|prod| prod.brand == value }
  end
end

Ruby相关问答推荐

如何从 DateTime 值中删除区域?

Kernel#gets try 读取文件而不是标准输入

如何从 Ruby 中的线程返回值?

有没有办法通过哈希初始化对象?

截断、事务和删除数据库策略的区别

Sinatra 是多线程的吗?

如何使用 Ruby OptionParser 指定所需的switch (不是参数)?

在Ruby中第一个=符号之后获取子字符串

Ruby 1.9 哈希,键中有破折号

跳过 Enumerable#collect 中的迭代

如何打破Ruby中的外循环?

是否可以使用 Ruby 读取文件的修改日期?

创建一个接受参数散列的 ruby​​ 方法

哪个键/值存储最有前途/最稳定?

正则表达式,如何匹配多行?

何时在 Ruby 中使用 `require`、`load` 或 `autoload`?

为什么这个 Ruby 对象同时具有 to_s 和 inspect 似乎做同样事情的方法?

Ruby 中的Monkey Patching到底是什么意思?

如何使用 minitest 运行所有测试?

如何在 Ruby 中创建整数循环?