1

注意:如果您想到更好的标题/问题,请随时提出建议。我不知道如何用一句话来表达这个问题。

我创建了一个命令行 Mastermind 游戏。要玩游戏,请play.rb在命令行中键入。

play.rb是一个启动游戏的 Ruby 脚本。在脚本中,游戏被发送一个接口,称为CommandLineInterface.

如果您想使用 GUI 进行游戏(我使用的是名为 Limelight 的 Ruby GUI),您可以cd进入limelight目录并键入limelight open production,然后 GUI 就会打开。

有一个mastermind_game目录,其中包含一个lib、一个spec和一个limelight目录。该limelight目录包含一个production目录。

现在我正在做一些改变。您可以在命令行向脚本传递参数。要么输入play.rb "command line game"要么play.rb "limelight game"

ARGV是在命令行传递的参数数组。

if ARGV.include?("command line game")
    interface = CommandLineInterface.new
elsif ARGV.include?("limelight game")
    interface = LimelightInterface.new
end

如果我想玩我的命令行游戏,我输入play.rb "command line game"它就可以正常工作。

我希望能够play.rb "limelight game"在命令行键入并打开 GUI。在ARGV中,将找到参数"limelight game",因此interface将设置为LimelightInterface.new。在我的LimelightInterface班级中,我希望初始化方法打开 GUI。limelight open production它本质上应该具有与在命令行键入相同的功能。

我不确定这是否可能或如何做到,所以任何帮助将不胜感激!谢谢!

编辑:我试图rvm use jruby通过在我的脚本中包含这一行来执行命令:

system("rvm use jruby")

我回来了:“RVM 不是一个函数,用 'rvm use ...' 选择红宝石是行不通的。”

4

2 回答 2

0

这是谷歌搜索标题的第一个结果:http: //tech.natemurray.com/2007/03/ruby-shell-commands.html

如果这不是你需要的,我不明白这个问题。

于 2012-09-10T18:53:18.753 回答
0

Ryan,有几种方法可以调用系统:

反引号: ruby -e 'p ARGV' '1 2' '3 4' # => "[\"1 2\", \"3 4\"]\n"

%x 文字(注意你可以使用任何你喜欢的分隔符,你不限于括号)

%x(ruby -e 'p ARGV' '1 2' '3 4') # => "[\"1 2\", \"3 4\"]\n"

system命令。这里的区别在于它通过 stdin / out / err 。(上面返回标准输出,这个打印在你的进程的标准输出上)。

system('ruby', '-e p ARGV', '1 2', '3 4')
# >> ["1 2", "3 4"]

如果您需要更复杂的用法, stdlib 中的open3之类的东西已经让我走得很远。如果你真的需要大枪(​​听起来不像你),有一个 gem open4


编辑:

听起来你想做这样的事情:

require 'open3'

bash_script = <<SCRIPT
source "$HOME/.rvm/scripts/rvm"
rvm use jruby
ruby -v
exit
SCRIPT

out, err, status = Open3.capture3 'bash', stdin_data: bash_script
puts out
# >> Using /Users/joshcheek/.rvm/gems/jruby-1.6.7
# >> jruby 1.6.7 (ruby-1.8.7-p357) (2012-02-22 3e82bc8) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_29) [darwin-x86_64-java]

但老实说,我不认为这对您的情况是一个很好的解决方案,因为有很多合法的方法可以为您的环境设置 jruby。我认为最好只检查一下limelight 二进制文件是否存在,如果不存在就告诉你的用户修复他们的环境。

于 2012-09-10T18:54:06.660 回答