无法加载机器人数据,因为没有将nil隐式转换为String(RuntimeError)

时间:2015-09-23 14:49:53

标签: ruby

我目前正在阅读“Beginning Ruby”,第12章“Begining Ruby-ChatterBox”,它构建了一个会话机器人。运行basic_client.rb文件时,收到错误消息:

: Can't load bot data because no implicit conversion of nil into String (RuntimeError)
from C:/RailsInstaller/Ruby2.1.0/bin/bot.rb:13:in `initialize'
from C:/RailsInstaller/Ruby2.1.0/bin/basic_client.rb:4:in `new'
from C:/RailsInstaller/Ruby2.1.0/bin/basic_client.rb:4:in `<main>'

过去曾提出过类似的问题。我咨询了这些例​​子,但仍然无法解决这个问题。如果有人可以帮我告诉我我做错了什么,我将不胜感激。这是我的代码文件的摘录。如果需要额外的信息,我很乐意让你知道。

bot.rb:

require 'yaml'
require_relative 'wordplay'

#A basic implementation of a chatterbox
class Bot
  attr_reader :name

  #Initialies the bot object, loads in the external YAML data
  # file and sets bot's name. Raises an exception if
  # the data loading process fails.
  def initialize(options)
    @name = options[:name] || "Unnamed Bot"
    begin
      @data = YAML.load(File.read(options[:data_file]))
    rescue => e
      raise "Can't load bot data because #{e}"
    end
  end

basic_client.rb:

require_relative 'bot'

bot = Bot.new(:name => ARGV[0], :data_file => ARGV[1])

puts bot.greeting

while input = $stdin.gets and input.chomp != 'end'
  puts '>> ' + bot.response_to(input)

end

puts bot.farewell

2 个答案:

答案 0 :(得分:0)

YAML.load(nil)
TypeError: no implicit conversion of nil into String

所以你应该小心:File.read(options[:data_file])的结果可能是零。

YAML.load(nil.to_s)
=> false

答案 1 :(得分:0)

线索在您的错误消息中:

from C:/RailsInstaller/Ruby2.1.0/bin/bot.rb:13:in `initialize'

bot.rb的第13行,在你的初始化方法中。

no implicit conversion of nil into String (RuntimeError)

它无法将nil变为字符串。

您的代码指定:

@name = options[:name] || "Unnamed Bot"

防范选项[:name]为nil

然而

 @data = YAML.load(File.read(options[:data_file]))

指定它尝试加载路径为options[:data_file]的文件。这是零。

因此,在运行客户端时,请确保传递您的名称和应从中加载yaml的数据文件。或者创建一个默认文件并传递:

 @data = YAML.load(File.read(options[:data_file] || 'path/to/default.yml'))