我使用书名作为键将书籍对象存储在哈希中。如果这本书已经在哈希中,我将调用另一个方法,所以我使用密钥检查它是否在哈希中?方法。但是,我收到错误“undefined method key? for nil::NilClass”
if self.bookshelf.key?(title)
为什么 self.bookshelf 是 nil:NilClass?请注意,按照我在代码中使用它的方式,此时我还没有向其中添加任何内容,因此检查此时运行时中是否存在密钥是没有意义的,但是,我需要稍后检查。所以当我注释掉那段代码并执行时
```self.bookshelf[title] = book ```
我得到 nil:NilClass 的未定义方法 []。如果我在类的
new
方法中创建一个新的Hash,为什么书架是nil?
class Shelf
attr_accessor :bookshelf
def new
bookshelf = Hash.new()
end
def add_book(title, book)
if self.bookshelf.key?(title)
#do something
else
self.bookshelf[title] = book
end
end
end
bookshelf =
(不带 self
)仅设置未在其他方法范围内设置的局部变量。相反,您需要使用 @bookshelf
或(使用 attr_accessor
时)self.bookshelf =
。请注意,通过 self.
创建的 getter 方法读取值时,不需要 attr_accessor
。
此外,您通常不会在 Ruby 中实现
new
方法。相反,您实现 initialize
,这是调用 new
时调用的方法之一。
这应该适合你:
class Shelf
attr_accessor :bookshelf
def initialize
self.bookshelf = {} # `{}` is idiomatic Ruby for `Hash.new`
end
def add_book(title, book)
if bookshelf.key?(title)
puts "Title '#{title}' is already in the bookshelf"
else
bookshelf[title] = book
end
end
end
shelf = Shelf.new
shelf.add_book('Book 1', '...')
shelf.add_book('Book 2', '...')
shelf.add_book('Book 1', '...')
#=> Title 'Book 1' is already in the bookshelf