Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby ARGV处理器:如何定义命令;"富",;由任何明确的前缀调用_Ruby_Command Line Interface_Thor - Fatal编程技术网

Ruby ARGV处理器:如何定义命令;"富",;由任何明确的前缀调用

Ruby ARGV处理器:如何定义命令;"富",;由任何明确的前缀调用,ruby,command-line-interface,thor,Ruby,Command Line Interface,Thor,我想用命令“foo”、“bar”和“find”定义一个命令行应用程序“cla”,以便: /cla foo和/cla fo都调用为foo定义的方法 /cla find和/cla fi都调用find /cla-bar和/cla-b都调用为bar定义的方法 /cla f引发错误 或者类似的东西。希望这是清楚的 这在托尔或指挥官身上是不明显的。我还没看过斯洛普。是否有任何ARGV处理器库具有此功能?有人能告诉我哪些库,并给我指出该特性的文档吗 编辑:澄清一下,我不是在寻求帮助解决上述具体问题。我想问的是

我想用命令“foo”、“bar”和“find”定义一个命令行应用程序“cla”,以便:

/cla foo
/cla fo
都调用为
foo
定义的方法

/cla find
/cla fi
都调用
find

/cla-bar
/cla-b
都调用为
bar
定义的方法

/cla f
引发错误

或者类似的东西。希望这是清楚的

这在托尔或指挥官身上是不明显的。我还没看过斯洛普。是否有任何ARGV处理器库具有此功能?有人能告诉我哪些库,并给我指出该特性的文档吗


编辑:澄清一下,我不是在寻求帮助解决上述具体问题。我想问的是,是否有可能(也不是太难)使用标准的命令行app builder库来实现这一点,它提供了许多我想要的有用功能,除了通过名称前缀调用命令的功能。

当一切都需要三行代码时,我看不出有任何理由去寻找库:

meths = %w(foo find bar) # or take from self.methods(false)

variants = meths.select { |m| m =~ /\A#{ARGV[1]}/ }
case variants.size
when 0 then raise 'Unknown method.'
when 1 then public_send variants.first # succeeded, call it
else raise "Umbiguity. Variants: #{variants}."
end

实际上,thor似乎能自动完成你想做的事情。具体来说,如果缩写形式明确匹配,它将执行相应的命令

举一个简单的例子:

#!/usr/bin/env ruby

require "thor"

class CLA < Thor
  desc "foo", 'Says "foo"'
  def foo
    puts "foo"
  end

  desc "find", 'Says "find"'
  def find
    puts "find"
  end

  desc "bar", 'Says "bar"'
  def bar
    puts "bar"
  end
end

CLA.start
如果您真的希望“f”始终映射到“foo”并且不给出不明确的命令错误,请像这样使用
map

desc "foo", 'Says "foo"'
def foo
  puts "foo"
end
map "f" => :foo
然后这就行了:

$ ./cla f
foo

我不是在找图书馆来做这件事。我可以编写代码来检查一个字符串是否恰好匹配一组正则表达式中的一个。我正在寻找一个库,它可以完成Thor、Commander等所做的许多事情,也可以让你完成OP中描述的事情。用上面的代码monkeypatching Thor/Commander有什么问题?必须同意mudasobwa。虽然我理解库的便利性,但它只有7行代码,如果适当压缩,甚至更少,并且可以轻松地包装在方法
parse_command
或类似的东西中。我没有仔细查看,但看起来可能需要为命令的每个前缀定义一个命令关键字,这意味着自动生成的使用输出将充满垃圾。Thor似乎支持从使用情况输出中隐藏关键字选项,但不支持关键字本身。如果有可能避免这种情况,那很可能需要让我自己熟悉雷神的设计,而不是有意义的设计。说真的,伙计们,我知道怎么写代码。这不是问题所在,谢谢。也许这只是我的阅读理解,但这似乎是Thor功能文档中的一个缺陷。我会跟他们提的顺便问一下你怎么知道的?你刚试过吗?你在什么地方读过吗?如果是后者,你还记得在哪里吗?我不想编辑Thor wiki条目,因为我担心会弄错细节,但是如果存在现有文档,应该从那里链接它们。我通过GitHub搜索并找到了引入此功能的提交:。从文档中可以明显看出这一点。
$ ./cla f
foo