是否可以使用属性创建哈希?

时间:2011-07-18 20:20:23

标签: ruby hash attributes

我希望能够从另一个集合中获取id,并将其用作哈希的键。然后我希望能够为每个属性应用各种属性。它会是这样的:

@books = Hash.new

@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"

或其他相似之处。这有可能通过一些调整来实现吗?

谢谢你的时间!

编辑:我应该补充一点,在这种情况下创建一个Class是不可取的,尽管我最终可能不得不这样做。

5 个答案:

答案 0 :(得分:3)

如果您想要完全符合该语法,则可以创建OpenStruct s的散列:

require 'ostruct'
@books = Hash.new { |h, k| h[k] = OpenStruct.new }
key = 1
@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"
@books #=> {1=>#<OpenStruct title="A Title", condition="Poor", rating="Excellent">}

答案 1 :(得分:2)

你可以使用多维哈希?

@books = Book.all
@books_hash = {}
@books.each do |book|
  @books_hash[book.id] = {}
  @books_hash[book.id][:title] = book.title
  @books_hash[book.id][:rating] = book.rating
end

答案 2 :(得分:1)

你可能永远不想这样做,只是为了回答这个问题。

  
    

这是否可以通过一些调整来实现?

  

是的,我们可以创建自己的类来轻松完成这项工作。

class MyAnonObject
  attr_accessor attributes

  def attributes
    @attributes ||= {}
  end

  def method_missing method, *args, &block
    if method =~ /^(\w+)=$/
      @attributes[$1] = args[0]
    else
      @attributes[$1]
    end     
  end
end

然后我们可以修改你的例子来使用这个新类。

@books = Hash.new { MyAnonObject.new }

@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"

话虽如此,我不推荐这个解决方案。阅读可能会让人感到困惑。但是,有可能=)实际上,这只是一个带有奇怪语义的多维哈希。

答案 3 :(得分:0)

您可以制作Book类型的对象。

class Book
  attr_accessor :tilte, :rating, :condition
end

然后修改您的示例以使用新的Book类。

@books = Hash.new

@books[key] = Book.new
@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"

答案 4 :(得分:0)

类似于deaththreetimes anser,但Book.new由Hash完成:

class Book
  attr_accessor :title
  attr_accessor :condition
  attr_accessor :rating
  def initialize()
    @undefined_values = {}
  end
  def method_missing ( m, *args )
    @undefined_values[m] = args
  end
  def inspect()
    "Book #{@title} (#{@condition}, #{@rating}, #{@undefined_values.inspect})"
  end
end  
@books = Hash.new{ |hash,k| hash[k] =  Book.new 
}

key = :xx
@books[key].title = "A Title"
@books[key].condition = "Poor"
@books[key].rating = "Excellent"
@books[key].isbn = "123456"

p @books[key] #-> Book A Title (Poor, Excellent, {:isbn==>["123456"]})

编辑:添加了处理未定义值的代码。     p @books [key]