1

我有一个名为“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这是我不知道的一些副作用吗?我怎么能越过这个?

4

2 回答 2

2

KernelRuby中大多数看起来像普通旧函数的东西实际上都是s = gets来自Kernel#gets. 来自精美Kernel手册

gets(sep=$/) → string or nil
gets(limit) → string or nil
gets(sep,limit) → string or nil

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

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

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

input = $stdin.gets.chomp
于 2013-07-23T04:06:08.200 回答
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
于 2013-07-23T04:13:22.097 回答