Ruby'得到'表现得很奇怪?

时间:2013-12-26 20:42:02

标签: ruby

我正在编写这个程序来管理dotfiles并且看起来似乎没有像往常一样,我无法通过Google追踪相关信息。

#!/usr/bin/env ruby

@filename = ''

unless $*[0].nil?
  # Storing filename (and adding dot) 
  @filename = "."+$*[0].to_s
else 
  # No filename given, exit and print to STDERR
  abort("No filename specified")
end


@file_path = File.expand_path("~/#{@filename}")

if File.exists?(@file_path)

  print "Enter something: "
  gets
  puts $_

end

但是,该程序在“获取”行崩溃,如此

$ ruby ./link.rb bash_profile
Enter something: /Users/krystah/repos/backpack/dotfiles/link.rb:24:in `gets': 
No such file or directory - bash_profile (Errno::ENOENT)
  from /Users/krystah/repos/backpack/dotfiles/link.rb:24:in `gets'
  from /Users/krystah/repos/backpack/dotfiles/link.rb:24:in `<main>'

1 个答案:

答案 0 :(得分:7)

来自fine manual

  

获取(sep = $ /)→string或nil
  获取(限制)→字符串或零
  获取(sep,limit)→string或nil

     

返回(并分配给$_ARGV(或$*)中文件列表中的下一行,如果命令行中没有文件,则返回标准输入

ARGV确实有这些内容,因此gets会尝试从名为'bash_profile'的文件中读取,然后抱怨没有此类文件。您可能希望更清楚地了解您的阅读地点:

print "Enter something: "
$stdin.gets
puts $_

这实际上是一个非常有趣的问题。 gets(以及Kernel中的许多其他功能)通常用于单行,因此他们的行为以惊人的方式专门化。一旦你理解了他们的预期目的,奇怪的行为就不那么令人惊讶了。