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 param は Regexp オブジェクトだと思います。ファイルは既に初期化メソッドにロードされているため、検索メソッドから file_name パラメータを削除する必要があると思います。

私の実装は次のようになります。

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

Enumerable には既に "@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 に答える
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 に答える