Struct && OpenStruct

1718 ワード

1 Structは本質的に単純なクラスであり、classを定義することなく属性とaccessorメソッドをカプセル化できます.
Bonus = Struct.new(:score,:per_score,:rate)  do
  def bonus
    self.score*self.rate*self.per_score
  end
end
user1_bonus = Bonus.new(12,2,0.5)
user1_bonus.bonus #12

Structは、フィールドを明確に宣言する必要があります.
user1_bonus.rate = 1
user1_bonus.rate #1
user1_bonus.bonus #24
user1_bonus.name= 'dong' # undefined method `name=' for #

 user1_bonus.to_json
 => "{\"score\":12,\"per_score\":2,\"rate\":0.5}" 
user1_bonus.to_h
 => {:score=>12, :per_score=>2, :rate=>0.5} 
Bonus.ancestors
 => [Bonus, Struct, Enumerable, Object, Kernel, BasicObject] 
Class.ancestors
[Class, Module, Object, Kernel, BasicObject] 

StructはEnumerableを継承し、
 user1_bonus.each{|x| puts x}
12
2
0.5

利点:定義が簡単で、構造がはっきりしている.定義されたものを呼び出すしかなく、Hashよりもエラーが発生しにくい.ruby内蔵、直接使用;C実現、性能が良い
2 OpenStruct OpenStructはHashのようなデータ構造で、hashよりpoint呼び出しが可能で、動的に属性を追加することができるオブジェクトが持つ値を使用して任意の属性を定義することができます.OpenStructはRuby標準ライブラリ内、Ruby実装
require 'ostruct' # 
a = OpenStruct.new name: 'dong',age: 12
OpenStruct.ancestors
 => [OpenStruct, ActiveSupport::ToJsonWithActiveSupportEncoder, Object, PP::ObjectMixin, JSON::Ext::Generator::GeneratorMethods::Object, ActiveSupport::Tryable, ActiveSupport::Dependencies::Loadable, Kernel, BasicObject] 

a.to_h
 => {:name=>"dong", :age=>12} 
a.to_json
 => "{\"table\":{\"name\":\"dong\",\"age\":12}}" 
a.each{|x| puts x}
 => nil