新手问题 我想请问一个有关 gets.chomp () 的问题

guohao1210 · 2019年06月13日 · 最后由 guohao1210 回复于 2019年06月20日 · 1245 次阅读

###我现在这个脚本是结合 gets.chompARGV 一起使用 (《笨办法学 ruby》13 节),我想在输入参数的时候,参数顺序可以任意改变,然后在后面用一个 hash+get.chomp 结合,将每一个参数赋值给正确的地方,但是 gets 部分出错,想请问一下是什么原因,如何修改。

AGRV = 19,180,"GUOHAO","hello","60"
ab={1 => "name", 2 => "age", 3 => "height" ,4 => "weight", 5 => "your words"}
puts ab       #告诉用户每个序号对应什么
a=0
ARGV.each do |i|
  a += 1
  print "请输入第#{a}个参数对应的序号"
  m=gets.chomp()             #应该是这里出错
  ab[m]=i                         #此处可能出错
end
puts "#{ab[5]}"           #从此处开始,实际上是把每一个参数放到puts里打印出来
puts "My name is #{ab[1]}"
puts "I'm #{ab[2]}years  old, #{ab[3]} tall and #{ab[4]} heavy."

####我之前把 gets.chomp()和 ab[m]=i 这两行换成了 puts i 就可以正常运行,所以能判断出前后都没有问题没有问题

所以我感觉只有 gets.chomp 有问题 但是不知道为何出错

这是我运行时出错:

$ ruby ex13-2.rb 19 180cm 60kg hello myname
{1=>"name", 2=>"age", 3=>"height", 4=>"weight", 5=>"your words"}
请输入第1个参数对应的序号Traceback (most recent call last):
    4: from ex13-2.rb:5:in `<main>'
    3: from ex13-2.rb:5:in `each'
    2: from ex13-2.rb:8:in `block in <main>'
    1: from ex13-2.rb:8:in `gets'
ex13-2.rb:8:in `gets': No such file or directory @ rb_sysopen - 19 (Errno::ENOENT)

那行改成 STDIN.gets.chomp() ,因为 gets 实际上是 Kernal.gets,它俩行为不一样:

  1. 当 ARGV 为空时,Kernal.gets 从 STDIN 读取内容,行为类似 STDIN.gets
  2. 当 ARGV 不为空时,kernals.gets 把 ARGV 的内容当作文件名,读取文件的下一行。

你的执行命令触发了第二条,把 19 当作了文件名,然后报错文件不存在。

参考 https://stackoverflow.com/questions/27453569/using-gets-gives-no-such-file-or-directory-error-when-i-pass-arguments-to-my/27453657

顶楼代码还有其他问题,考虑到楼主正在练习,我先不指出。

2 楼 已删除
Rei 回复

非常感谢 今天刚进社区看到 2333 我也从其他地方找到了同样的改法 不过没有你这个解释嘻嘻嘻 其他的问题我再可能一下吧 另外就是我之修改了一下 gets 这里 没有发现 19 当作文件名这个错误😶

需要 登录 后方可回复, 如果你还没有账号请 注册新账号