我有一个YAML文件books.yaml
:
- !ruby.object:Book
title: Ruby for Newbz
author: LeeRoy Jenkins
category: Educational
我已经有一个方法可以为这个文件添加书籍,但我需要一个可以使用正则表达式搜索YAML文件的方法。如果没有书与标题匹配,那么它应该引发异常NoBookfound
。如果有任何匹配,则应将该列表返回给调用者。
这是我现有的代码:
require 'yaml'
require './book'
class Library
attr_accessor :books
def initialize file_name = false
@books = file_name ? YAML::load(File.read(file_name)) : []
end
def add_book(book)
@books.push(book)
end
def search_library(file_name , book)
if
YAML::load(File.read(file_name)).include?(book) == false
raise 'No Book Found'
end
end
end
这是我为异常部分尝试的东西,但我觉得我离开了。我是Ruby的新手,这似乎是一项非常艰巨的任务。有没有人有任何想法?
答案 0 :(得分:0)
您需要的是从加载的对象中测试类:
book = YAML::load(File.read(file_name))
raise 'No Book Found' unless book.kind_of? Book
还有一些kind_of?
个替代品,您可以阅读这些nice question
答案 1 :(得分:0)
根据你的帖子,我猜那本书的参数是一个Regexp对象。 我认为你应该从搜索方法中删除file_name param,因为该文件已经在initialize方法上加载了。
我的实施将是:
def search_library term
@books.find_all {|b| b.title =~ term}
end
答案 2 :(得分:0)
由于您已经在可枚举中包含“@books”,因此您可以使用select
method查找标题中包含搜索字词作为子字符串的图书。
def search_library(term)
matches = @books.select { |x| x.title.index(term) }
raise "No books have title like '#{term}'" if matches.empty?
matches
end