ruby - 如何使用 Ruby 创建类似 ".find_by_something_and_something_else"的方法?

标签 ruby metaprogramming

使用 Ruby 我知道您可以非常有创意地命名您的方法。例如在 rails 中你有 .find_by_this_and_that

我该怎么做?

示例:

def get_persons_with_5_things
  res = []
  persons.each do |person|
    if person.number_of_things == %MAGICALLY GET THE NUMBER 5 FROM FUNCTION NAME%
      res << person
    end
  end
  return res
end

我什至不确定你是如何称呼这种东西的,所以任何指点都将不胜感激。

最佳答案

我对你的例子有点困惑。如果您在方法名称中使用硬编码 5 定义方法,则无需在方法主体内神奇地找出它。如果你想在缺少方法的情况下做一些动态的事情,那就是这样的:

def method_missing(name, *args)
  if name.to_s =~ /get_persons_with_(\d+)_things/
    number_of_things = $1.to_i
    res = []
    persons.each do |person|
      if person.number_of_things == number_of_things
        res << person
      end
    end
    return res
  else
    return super(name, *args)
  end
end

[编辑(Jörg W Mittag)]:这是实现相同方法的更像 Rubyish 的方式:

def method_missing(name, *args)
  return super unless name.to_s =~ /get_persons_with_(\d+)_things/
  number_of_things = $1.to_i
  return persons.select {|person| person.number_of_things == number_of_things }
end
  • super 没有任何参数只是传递原始参数,不需要显式传递它们
  • 由尾随 ifunless 表达式保护的早期 return 大大清除了控制流
  • 所有 each 迭代器所做的,就是根据谓词选择项目;但是,已经有一个用于选择项目的迭代器:select

关于ruby - 如何使用 Ruby 创建类似 ".find_by_something_and_something_else"的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1868269/

相关文章:

c++ - 扩展包含 int 包的类型

类似于 Haskells 循环的 Ruby 方法

ruby-on-rails - 如何对哈希的分层数组进行排序

ruby - 关于 ruby 波彭

java - 注释是 Java 中的某种 DSL 吗?

ruby - 给定一个 Ruby 对象的实例,我如何获得它的元类?

C++ 模板元编程——根据运行时输入返回一个类型

ruby - 为什么 rvm install ruby​​ 不起作用?

ruby-on-rails - 在 Azure 中通过 Docker bash 运行 Rails CLI 命令

ruby-on-rails - 元编程 String#scan 和全局变量?