Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby gets方法在从控制台传递参数时引发异常_Ruby_Shell_Command Line_Argv_Gets - Fatal编程技术网

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