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