是否可以在ruby / irb中字符串化参数?

时间:2011-03-12 06:10:06

标签: ruby

我是红宝石的新手......想知道以下是否可行:

我目前在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...")

由于

2 个答案:

答案 0 :(得分:2)

您实际上可以修补getsIRB::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>