Ruby gets方法在从控制台传递参数时引发异常
我在下面的代码中遇到了一些奇怪的行为:Ruby gets方法在从控制台传递参数时引发异常,ruby,shell,command-line,argv,gets,Ruby,Shell,Command Line,Argv,Gets,我在下面的代码中遇到了一些奇怪的行为: require 'CSV' $DEBUG = ARGV.empty? ? false : ARGV[0] #Global debug flag. class PhoneBook #class code here etc etc end PhoneBook.start_dir = "file-io-samples/phonebooks/" puts "Enter a phonebook!" name = gets #This is the prob
require 'CSV'
$DEBUG = ARGV.empty? ? false : ARGV[0] #Global debug flag.
class PhoneBook
#class code here etc etc
end
PhoneBook.start_dir = "file-io-samples/phonebooks/"
puts "Enter a phonebook!"
name = gets #This is the problem.
puts "Using #{name}.."
当我在执行时通过true将$DEBUG
设置为true时,我从name=get
得到一个错误,我不知道为什么。如果我不通过命令行传递参数,一切正常
这是错误输出:
C:\Pickaxe>ruby PhoneBook.rb
Enter a phonebook!
Hurrah! Works
Using Hurrah! Works
..
C:\Pickaxe>ruby PhoneBook.rb true
Enter a phonebook!
Exception `Errno::ENOENT' at PhoneBook.rb:62 - No such file or directory - true
PhoneBook.rb:62:in `gets': No such file or directory - true (Errno::ENOENT)
from PhoneBook.rb:62:in `gets'
from PhoneBook.rb:62:in `<main>'
C:\Pickaxe>
C:\Pickaxe>ruby PhoneBook.rb
输入电话簿!
万岁!作品
万岁!作品
..
C:\Pickaxe>ruby PhoneBook.rb true
输入电话簿!
PhoneBook.rb:62处出现异常“Errno::enoint”-没有此类文件或目录-true
PhoneBook.rb:62:in'get':没有这样的文件或目录-true(Errno::enoint)
来自电话簿。rb:62:in'get'
来自电话簿。rb:62:in`'
C:\鹤嘴锄>
如果需要,我可以发布类定义,但我认为这不是问题的一部分。这不会在*nix上造成问题,但我希望Windows或Ruby on Windows不会以同样的方式处理附加命令行参数。在*nix上,我们可以在脚本名和参数之间使用
--
,告诉操作系统不要将参数作为标志传递。换句话说,Ruby不会看到true
,脚本会看到
ruby some_script.rb -- options
但是,总的来说,我认为您做得不对,建议您使用类以标准方式处理命令行选项:
在我的Mac OS系统上使用不同的参数运行几次,可以得到:
$ ruby test.rb
false
$ ruby test.rb --no-debug
false
$ ruby test.rb -d
true
$ ruby test.rb --debug
true
您可能仍然需要使用
--
来告诉操作系统和被调用的应用程序哪些参数属于什么。获取
如果没有传递参数,则从stdin读取,否则从作为参数传递的文件读取。您正在传递一个参数true
,因此get
尝试从名为true
的文件中读取,该文件显然不存在
这是gets
文档的第一句话:
从ARGV
(或$*
)中的文件列表中返回下一行(并将其分配给$)
+1用于OptionParser建议。不过我想出来了。在执行更多reasearch GET时,会自然搜索ARGV参数以获取参数中的文件。我也不得不使用$stdin.get。应与on*nix相同
$ ruby test.rb
false
$ ruby test.rb --no-debug
false
$ ruby test.rb -d
true
$ ruby test.rb --debug
true