YAML ::使用gets方法加载(内容)问题

时间:2013-07-23 03:44:33

标签: ruby load yaml

我有一个名为' contents.txt'的文件。其中包含YAML格式的文本。

我将命令行传递给ruby Minesweeper.rb contents.txt

然后,我有一个加载功能:

def self.load
  grid = YAML::load(File.open(ARGV[0]))
  grid
end

在我的主play循环中,我使用命令input = gets.chomp

从用户那里获取输入

问题是,在我从用户那里获取任何输入之前,我收到一个错误,因为输入没有从用户那里得到任何东西。相反,它正在获取文件的每一行并在循环中运行,直到当然发生错误,因为我的代码没有配置为运行随机输入,例如来自文件的那些。

这是YAML::load的一些我不知道的副作用吗?我怎么能超越这个?

2 个答案:

答案 0 :(得分:2)

Ruby中看起来像普通旧函数的大部分内容实际上都是来自Kernel的方法,特别是当你说s = gets实际上是在调用Kernel#gets时。来自fine Kernel manual

  

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

     

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

所以gets(不在IO实例内)将从命令行中提到的文件中读取设计。这样做可以更轻松地编写命令行过滤器和一次性ruby -e脚本,例如,您可以说grep pancakes只搜索文件grep来搜索标准输入。

如果你想从标准输入读取,那么你应该这样说:

input = $stdin.gets.chomp

答案 1 :(得分:1)

除了@ mu-is-too-short的答案之外,您可能需要稍微调整一下代码。

您确定要self.load成为班级方法吗?我不认为在这种情况下ARGV[0]可用。

我相信你想要File.read(又名IO.read),而不是File.open只会给你一个File个实例。您随后需要致电file.read

require 'yaml'

class Runner
  attr_reader :file_name

  def initialize(file_name)
    @file_name = file_name
  end

  def load
    file = File.read(file_name)
    ::YAML::load(file)
  end
end

Runner.new(ARGV[0]).load