我是红宝石的新手......想知道以下是否可行:
我目前在irb(irb -r test.rb)中运行测试应用程序并手动执行 test.rb中实现的各种命令。其中一项功能目前实施如下:
def cli(cmd)
ret=$client.Cli(cmd)
print ret, "\n"
end
$client.Cli()
取一个字符串。我目前在IRB提示符下键入以下内容
> cli "some command with parameters"
这是通过套接字发送的,并返回结果
我希望能够在没有引号的情况下做到这一点。这只适用于此命令 有没有办法在红宝石中做到这一点?如果不是,你会如何扩展irb来做到这一点?
对于那些知道'C'的人来说,这将是如下:
#define CLI(CMD) cli(#CMD)
CLI(Quadafi and Sheen walk into a bar...)
预处理输出为:
cli("Quadafi and Sheen walk into a bar...")
由于
答案 0 :(得分:2)
您实际上可以修补gets
和IRB::StdioInputMethod
类的IRB::ReadlineInputMethod
方法,并在调用cli
方法时执行重写,方法是添加以下内容:您的test.rb
文件:
module IRB
def self.add_quotes(str)
str.gsub(/^cli (..+?)(\\+)?$/, 'cli "\1\2\2"') unless str.nil?
end
class StdioInputMethod
alias :old_gets :gets
def gets
IRB::add_quotes(old_gets)
end
end
class ReadlineInputMethod
alias :old_gets :gets
def gets
IRB::add_quotes(old_gets)
end
end
end
这样,匹配cli ...
的任何输入行在评估之前都会被cli "..."
替换。
答案 1 :(得分:0)
我认为这是不可能的,因为你输入irb的命令必须解析为ruby,而所有这些单词都会报告这样的错误:
NameError: undefined local variable or method `hello' for main:Object
(我的第一次尝试,我刚刚通过cli hello
调用它。)
但如果你不介意一个更激进的改变,你可以这样做:
$ cat /tmp/test_cases
hello world
one
two
three
riding the corpse sled
$ ruby -e 'def f(arg) puts arg end' -ne 'f($_)' < /tmp/test_cases
hello world
one
two
three
riding the corpse sled
我刚刚在这里定义了一个简单的函数f()
,它将展示它是如何工作的;您可以将f($_)
替换为$Client.cli($_)
,并在第一个$Client
参数中设置-e
全局变量。如果您想以交互方式键入它们,可以不使用< /tmp/test_cases
:
$ ruby -e 'def f(arg) puts arg end' -ne 'f($_)'
hello
hello
world
world
当然,如果你想要它比这更先进,我只需要编写一个脚本来完成所有操作,而不是从-pe
或-ne
命令构建一些隐藏的东西。 / p>