ruby - 在 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
这种方法有效,但是将这样的类名作为参数传递感觉不对?或者可能是?
解决方案
没关系...一般都称为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
推荐阅读
- android - 无法将 Amplify 存储与周期性工作器一起使用
- sql - 使用oracle合并sql语句的增量加载逻辑
- node.js - Node.js 应用程序在生产中启动永无止境的进程
- arrays - 对具有相同组成的字符串进行分组
- android - Retrofit 2.0 - 添加标题不起作用
- python - 我可以创建和存储简单模拟的快照吗?
- python - 如何在python flask,Ionic 5中将Flask静态文件夹路径设置为离子生产构建文件夹“www”?
- elasticsearch - 如何编写弹性搜索查询以获取包含日期和计数的 50 个问题的列表
- ant - 如何在 Ant Task 中启动单独的进程
- python - 每次 Web 请求到达时是否都会创建一个新的 docker 实例/图像?