gpt4 book ai didi

ruby - 编写一个 ruby​​ 命令行应用程序;最好的方法是做到这一点?

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:23 25 4
gpt4 key购买 nike

我有一个正在开发的命令行 Ruby 应用程序,我想允许它的用户提供将在部分过程中作为过滤器运行的代码。基本上,应用程序是这样做的:

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

我希望过滤过程(第 2 步)尽可能灵活。

我的想法是,用户可以提供一个 Ruby 文件,该文件设置一个已知常量以指向实现我定义的接口(interface)的对象,例如:

# 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 中有更好的习惯用法吗?

最佳答案

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

If a filter is specified, use it to filter data

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

ruby dataprocessor.rb custom_filter

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

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

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

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

顺便说一句,这与 rails 为 require 模型所做的非常相似,这就是为什么您可以只使用 SomeModel 而不必总是执行 require app/models/some_model 首先 :-)`

关于ruby - 编写一个 ruby​​ 命令行应用程序;最好的方法是做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/251444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com