我目前正在阅读“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
答案 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'))