如果hash为nil,如何设置key?

问题描述 投票:0回答:1

我使用书名作为键将书籍对象存储在哈希中。如果这本书已经在哈希中,我将调用另一个方法,所以我使用密钥检查它是否在哈希中?方法。但是,我收到错误“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 
ruby hash
1个回答
1
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.