我如何搜索YAML文件?

时间:2013-06-03 19:18:34

标签: ruby

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

3 个答案:

答案 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