我有一个正在开发的命令行 Ruby 应用程序,我想允许它的用户提供将作为过滤器运行在部分流程上的代码。基本上,应用程序这样做:
- 读入一些数据
- 如果指定了过滤器,则使用它来过滤数据
- 处理数据
我希望过滤过程(步骤 2)尽可能灵活。
我的想法是,用户可以提供一个 Ruby 文件,该文件设置一个已知常量以指向实现我定义的接口的对象,例如:
# user's filter
class MyFilter
def do_filter(array_to_filter)
filtered_array = Array.new
# do my filtering on array_to_filter
filtered_array
end
FILTER = MyFilter.new
然后,我的应用程序代码将执行以下操作:
array_that_might_get_filtered = get_my_array()
if (options.filter_file)
require options.filter_file
array_that_might_get_filtered = FILTER.do_filter(array_that_might_get_filtered)
end
虽然这可行,但感觉很俗气,似乎应该有更好的方法来做到这一点。我还考虑让过滤器采用将已知名称的方法添加到已知类的形式,但这似乎也不太正确。
Ruby中有更好的成语吗?