【问题标题】:When calling a second program via load, gets reads from ARGV[0] of original program通过加载调用第二个程序时,从原始程序的 ARGV[0] 读取
【发布时间】:2013-10-23 10:12:27
【问题描述】:

考虑一个名为weird1.rb的文件:

load 'weird2.rb'

weird2.rb:

p = gets.chomp
puts "Got input: #{p}"

当我不带任何参数运行weird1.rb 时,gets 从控制台读取用户的输入:

c:\a\ruby>weird1.rb
test
Got input: test

当我使用参数运行它时,gets 从给定的参数中读取(someRandomArgweird2.rb,分别在以下情况下):

c:\a\ruby>weird1.rb someRandomArg
weird2.rb:1:in `gets': No such file or directory - someRandomArg (Errno::ENOENT)

c:\a\ruby>weird1.rb weird2.rb
Got input: p = gets.chomp

为什么weird2 读取weird1 的参数?这似乎出乎意料; gets 应该从 stdin 读取,而不是文件。发生了什么,我该如何解决?

【问题讨论】:

  • (顺便说一句,这是问题的一个大大简化的版本;原始代码的目的是在执行不同的文件之前进行一些预设置)
  • @sawa 非常感谢您在那里进行的清理工作,谢谢! (我觉得标题有点模糊,所以我编辑了它)

标签: ruby argv


【解决方案1】:

负载部分与它无关。如果您直接调用带有和不带参数的怪异2.rb,应该会发生同样的事情。

您看到的效果是获取类似于 unix 过滤器的功能,这意味着如果未指定文件,它将从 STDIN 读取,否则将通过命令行提供文件。

如果您正在通过怪异.rb 进行一些预处理,则在加载怪异2.rb 之前通过 shift 从 ARGV 中删除任何参数,如下所示:

my_arg = ARGV.shift
# do stuff with my_arg
load 'weird2.rb'

【讨论】:

  • 等等,但我不会用任何参数调用weird2。我只是用参数调用weird1;他们被传递了吗?无论如何,如何让gets 再次从标准输入读取?
  • 如果奇怪的.rb 需要某个参数,让它从 ARGV 中移出:
  • 所以,load ARGV.shift?做到了,介意编辑您的答案以包含它吗?
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 2013-03-23
  • 2011-07-02
  • 1970-01-01
  • 2020-10-21
  • 2013-03-12
  • 2013-09-11
  • 1970-01-01
相关资源
最近更新 更多