gpt4 book ai didi

ruby ,雷神 gem ArgumentError

转载 作者:太空宇宙 更新时间:2023-11-03 16:31:02 28 4
gpt4 key购买 nike

我正在研究应该用作 CLI 的 Ruby gem效用。

我决定使用 Thor ,它由 rails 命令使用并且似乎非常灵活(关于与 rake 的区别:link)。

问题是我找不到如何处理输入错误。例如,如果我输入了错误的选项,Thor 会自动返回一个很好的警告:

$ myawesomescript blabla
Could not find command "blabla".

但是,如果我使用无法解析的命令,事情就会变得很糟糕。例如,有一个“help”默认命令,我定义了一个“hello”命令。如果我只输入“h”,这就是我得到的:

$ myawesomescript h
/Users/Tom/.rvm/gems/ruby-2.0.0-p0/gems/thor-0.18.1/lib/thor.rb:424:in `normalize_command_name': Ambiguous command h matches [hello, help] (ArgumentError)
from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/gems/thor-0.18.1/lib/thor.rb:340:in `dispatch'
from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/gems/thor-0.18.1/lib/thor/base.rb:439:in `start'
from /Users/Tom/Documents/ruby/myawesomescript/bin/myawesomescript:9:in `<top (required)>'
from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/bin/myawesomescript:23:in `load'
from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/bin/myawesomescript:23:in `<main>'
from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `eval'
from /Users/Tom/.rvm/gems/ruby-2.0.0-p0/bin/ruby_noexec_wrapper:14:in `<main>'
myawesomescript $

现在,我知道只输入“h”是愚蠢的,我可以重命名我的命令,但我不希望用户看到这类错误消息。

我试图用以下方法覆盖该方法:

def normalize_command_name(meth)
super(meth)
rescue ArgumentError => e
puts "print something useful"
end

...但是它不起作用


新细节:

好的,我注意到那个方法是在类上声明的,而不是在实例上声明的。我尝试了以下方法并且似乎工作得很好,但它并不理想而且有点老套:

文件:lib/myawesomescript/thor_overrides.rb

require 'thor'

class Thor
class << self

protected
def normalize_command_name(meth)
return default_command.to_s.gsub('-', '_') unless meth

possibilities = find_command_possibilities(meth)
if possibilities.size > 1
raise ArgumentError, "Ambiguous command #{meth} matches [#{possibilities.join(', ')}]"
elsif possibilities.size < 1
meth = meth || default_command
elsif map[meth]
meth = map[meth]
else
meth = possibilities.first
end

meth.to_s.gsub('-','_') # treat foo-bar as foo_bar
rescue ArgumentError => e
# do nothing
end
alias normalize_task_name normalize_command_name
end
end

我在那里添加了以下行:

rescue ArgumentError => e
# do nothing

它确实起到了作用,因为似乎在其他地方有一些代码处理了错误消息:

$ myawesomescript h
Could not find command "h".

有没有更好的方法?

最佳答案

如果您查看错误消息:

 Ambiguous command h matches [hello, help]

上面的意思是,对于 h,thor 找到了不止一个匹配项。这是由于 help 命令已经定义(内置)。

我建议您使用内置的帮助命令来显示有关您的 CLI 工具功能的帮助和选项,而不是尝试绕过它。

要让一个字母的命令快捷方式起作用 - 你应该命名你的命令而不是从字母 h 开始,比如 foo bar, yo 等等

如果您想要以字母 h 开头的命令,请更具体一些。

关于 ruby ,雷神 gem ArgumentError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15927850/

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