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

问题描述 投票:1回答:2

我有一个名为'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的一些副作用吗?我怎么能超过这个?

ruby load yaml
2个回答
2
投票

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

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

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

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

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

input = $stdin.gets.chomp

1
投票

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

你确定你想要self.load成为一种类方法吗?我不认为ARGV[0]将在这种情况下可用。

我相信你想要File.read(aka,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
热门问题
推荐问题
最新问题