编写一个ruby命令行应用程序; 最好的办法吗?

dav*_*000 6 ruby idioms

我有一个命令行Ruby应用程序我正在开发,我想允许它的用户提供将作为过程的一部分进行过滤的代码.基本上,应用程序执行此操作:

  1. 读入一些数据
  2. 如果指定了过滤器,则使用它来过滤数据
  3. 处理数据

我希望过滤过程(步骤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
Run Code Online (Sandbox Code Playgroud)

我的应用程序的代码将执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

虽然这会起作用,但感觉很俗气,似乎应该有更好的方法来做到这一点.我还认为过滤器的形式是为已知类添加已知名称的方法,但这似乎也不正确.

Ruby中有更好的成语吗?

Ori*_*rds 4

我只是使用命令行和约定的组合。

如果指定了过滤器,则使用它来过滤数据

我假设您会在命令行上指定一个过滤器?那么您会像这样调用应用程序吗?

ruby dataprocessor.rb custom_filter
Run Code Online (Sandbox Code Playgroud)

如果是这样,您可以定义一个“api”,其中类名必须与传入的内容相匹配 - 与您在示例中描述的方式几乎完全相同。

不过,更进一步,您可以使用一些逻辑来CustomFilter使用 ruby​​ 查找该类defined?,如果找不到,则继续查找custom_filter.rb(或任何合适的变体)并尝试加载该文件,然后重试。

这为您提供了很好的可扩展性,因为您可以编写任意数量的过滤器类,将它们放入自己的 .rb 文件中,并将它们放在 ruby​​ 可以找到它们的任何地方。您也不必有预定义的常量,唯一的约束是

  1. 类名必须与文件名(的变体)匹配 - 这是 ruby​​ 中的约定,因此您可能已经这样做了。
  2. 它必须有一些预定义的方法,例如您的do_filter方法

顺便说一句,这与 Rails 对模型的要求非常相似,这就是为什么您可以直接使用而SomeModel不必总是先做require app/models/some_model:-)`