1

我有一个 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 真的很陌生,这似乎是一项非常艰巨的任务。有没有人有任何想法?

4

3 回答 3

0

您需要的是从加载的对象中测试类:

book = YAML::load(File.read(file_name))
raise 'No Book Found' unless book.kind_of? Book

还有一些kind_of?替代方案,您可以阅读关于这个好问题的差异

于 2013-06-03T19:28:08.463 回答
0

根据您的帖子,我猜这本书的参数是一个 Regexp 对象。我认为您应该从搜索方法中删除 file_name 参数,因为该文件已经在初始化方法中加载。

我的实现是:

def search_library term
  @books.find_all {|b| b.title =~ term}
end
于 2013-06-03T19:38:50.353 回答
0

由于您已经在可枚举中拥有“@books”,因此您可以使用该select方法查找其标题将搜索词作为子字符串的书籍。

def search_library(term)
  matches = @books.select { |x| x.title.index(term) }
  raise "No books have title like '#{term}'" if matches.empty?
  matches
end
于 2013-06-03T23:03:05.873 回答