首页 > 解决方案 > 在 Ruby 中将类作为参数传递

问题描述

我有一个包含所有静态方法的 Ruby 类。我想在另一个类中使用这些方法。只传递类名是可行的,但想知道它是正确的方法还是有其他方法。

class Foo
    IDENTIFIER = 'UYT78'
    def self.some_data
      DB.fetch_records
    end

    # and so forth
end

class Bar
    IDENTIFIER = 'XXXXX'
    def self.some_data
      DB.fetch_records
    end

    # and so forth
end

class Reporter

  def report
    Foo.some_data.select {|x| x.id == Foo::identifier}
  end

  def other_report
    Bar.some_data.select {|x| x.id == Foo::identifier}
  end
end

是否可以将 Reporter 更改为接受 Foo 作为方法的参数,以便可以根据传递的参数重用这些方法?

Reporter.report(Foo)
Reporter.report(Bar)

和报告方法看起来像

def report(klass)
  klass.some_data.select {|x| x.id == Foo::identifier}
end

这种方法有效,但是将这样的类名作为参数传递感觉不对?或者可能是?

标签: rubyoop

解决方案


没关系...一般都称为duck-typing...只要传递的类支持#some_data方法,它是什么具体的类并不重要。如果它长得像鸭子,叫起来像鸭子……

您可能希望在初始化时存储目标类。

class Reporter
  attr_accessor :klass
  def initialize(klass)
    self.klass = klass
  end

  def report
    klass.some_data.select
  end
end

my_foo_reporter = Reporter.new(Foo)

my_foo_reporter.report # calls some_date on Foo class

推荐阅读