Struct用起來很順手。Struct看起來像是一個簡單的類,我也一直把它當類來用。但其實它和通常的類不太同樣。html
有些時候,咱們須要把一些屬性放在一塊兒,但又不須要給它一些特殊方法,這個時候咱們能夠選擇Struct。這種場景在算法中最多見。算法
這個地方須要注意。Struct的equal同class的默認equal不一樣。class的默認equal,只有是同一個對象相等,纔會返回true。今天寫算法的時候就被坑在這了,補了測試,才發現問題。
而Struct的,只要值相等,就會返回true,代碼以下:ruby
class Foo attr_accessor :a def initialize(a) self.a = a end end f1 = Foo.new("foo") f2 = Foo.new("foo") f1 == f2 # => false Bar = Struct.new(:a) b1 = Bar.new("bar") b2 = Bar.new("bar") b1 == b2 # => true
Struct.new("Customer", :name, :address) #=> Struct::Customer Struct::Customer.new("Dave", "123 Main") #=> #<struct Struct::Customer name="Dave", address="123 Main"> # Create a structure named by its constant Customer = Struct.new(:name, :address) #=> Customer Customer.new("Dave", "123 Main")
我的更喜歡第二種。測試
b1.a, b1[:a], b1["a"], b1[0]
咱們能夠看到,struct很是靈活的。code
b1.members # => [:a] b1.values # => ["bar"]
b1.each {|value| puts value } b1.each_pair {|name, value| puts("#{name} => #{value}") } Lots = Struct.new(:a, :b, :c, :d, :e, :f) l = Lots.new(11, 22, 33, 44, 55, 66) l.select {|v| (v % 2).zero? } #=> [22, 44, 66]
平時要讀讀文檔,要否則會被坑(==
)。要寫測試,測試能夠幫助咱們發現問題。htm
struct比想象中要方便。對象
Ruby doc文檔