您可以嘗試使用OpenStruct。
OpenStruct是一種類似於哈希的數據結構,它允許定義任意屬性及其伴隨的值的 。 這是通過使用Ruby的元編程來定義類本身的方法 。
require 'ostruct'
(0..10).map { |i| OpenStruct.new(:id => i*10, :name => "#{i*10}%") }
# => [#<OpenStruct id=0, name="0%">, #<OpenStruct id=10, name="10%">, ...
但是如果你需要一個真正的類,而不是匿名類像OpenStruct,那麼只需要創建一個收集/映射方法在這裏面的類實例:
class Ratio
attr_reader :id, :name
def initialize(id, name)
@id = id; @name = name
end
end
(0..10).map { |i| ratio = i*10; Ratio.new(ratio, "#{ratio}%") }
# => [#<Ratio: @id=0, @name="0%">, #<Ratio: @id=10, @name="10%">, ...
也許我誤會你了了一下,你想從範圍內不會產生這種結構,但是從陣列[["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]]
那麼代碼是相似的:
require 'ostruct'
arr = [["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]]
p arr.map { |name, id| OpenStruct.new(:id => id, :name => name) }
# => [#<OpenStruct id=0, name="0 %">, #<OpenStruct id=10, name="10 %">, #<OpenStruct id=20, name="20 %">, #<OpenStruct id=30, name="30 %">]
UPDATE 我發現OpenStruct的使用一個角落的情況下(貌似這是情況的Ruby 1.8.7只):OpenStruct#id
將返回object_id
爲id
而不是字段值:
ruby-1.8.7-p352 > o = OpenStruct.new :id => 10
=> #<OpenStruct id=10>
ruby-1.8.7-p352 > o.id
(irb):4: warning: Object#id will be deprecated; use Object#object_id
=> 70021843187380
有兩種解決方法:
# 1. redefine OpenStruct#id method:
OpenStruct.__send__(:define_method, :id) { @table[:id] }
# 2. dont use 'id' as a value and use any other value:
require 'ostruct'
(0..10).map { |i| OpenStruct.new(:value => i*10, :name => "#{i*10}%") } # 'value' instead of 'id'
...
options_from_collection_for_select(@arr, 'value', 'name')
我建議你使用第二種方法。
thnx亞歷克斯..也可以建議一些書或參考開始數據結構和紅寶石元編程..這將是非常有益的。我目前正在研究一些rails項目,並且經常需要使用上面的結構。 – 2012-01-31 12:47:20
@mashit,在我看來,最好的地方是基礎類庫[ruby-doc.org](http://ruby-doc.org/core-1.9.3/)。如果你想深入研究ruby,我可以推薦Matz的Ruby編程語言*。爲了更深入的元編程理解,您可以檢查Perotta的書* Metaprogramming Ruby *。 – 2012-01-31 12:52:50
是的,我需要(你的第二個回覆) – 2012-01-31 12:59:28