Ruby Struct Equal

Struct用起來很順手。Struct看起來像是一個簡單的類,我也一直把它當類來用。但其實它和通常的類不太同樣。html

Struct

有些時候,咱們須要把一些屬性放在一塊兒,但又不須要給它一些特殊方法,這個時候咱們能夠選擇Struct。這種場景在算法中最多見。算法

equal

這個地方須要注意。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")

我的更喜歡第二種。測試

accessor

b1.a, b1[:a], b1["a"], b1[0]
咱們能夠看到,struct很是靈活的。code

members, values

b1.members
# => [:a]

b1.values
# => ["bar"]

遍歷(each, each_pair) && select

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]

總結

  1. 平時要讀讀文檔,要否則會被坑(==)。要寫測試,測試能夠幫助咱們發現問題。htm

  2. struct比想象中要方便。對象

參考

Ruby doc文檔

相關文章
相關標籤/搜索