Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby Struct

Avatar for Ken Collins Ken Collins
April 11, 2012
600

Ruby Struct

Using Ruby’s Struct Class.

Avatar for Ken Collins

Ken Collins

April 11, 2012
Tweet

Transcript

  1. Ruby’s Struct Class Ken Collins metaskills.net typdef struct { int

    id; char *name; } Awesome; Monday, November 14, 11
  2. A Struct is a convenient way to bundle a number

    of attributes together, using accessor methods, without having to write an explicit class. Monday, November 14, 11
  3. Ad Hoc Example Language = Struct.new(:name, :class_based) ruby = Language.new

    "Ruby", true js = Language.new "JavaScript", false objc = Language.new "Objective-C" ruby # => #<struct Language name="Ruby", class_based=true> js # => #<struct Language name="JavaScript", class_based=false> ruby.class_based # => true js.class_based # => false objc.class_based = true objc.class_based # => true Monday, November 14, 11
  4. Sub Class Example class MyObject < Struct.new(:id, :name, :key) end

    o = MyObject.new # => #<struct MyObject id=nil, name=nil, key=nil> o.id # => nil o.name # => nil o.id = 12345 o.name = "Test Object" o # => #<struct MyObject id=12345, name="Test Object", key=nil> Monday, November 14, 11
  5. But Why Structs? class MyObject attr_accessor :id, :name, :key def

    initialize(*args) @id, @name, @key = args end end o = MyObject.new 12345, "Test Object" o.id # => 12345 o.name # => "Test Object" Monday, November 14, 11
  6. But Why Structs? Convenient Alternative. Attribute Methods With [] &

    []= Can Be Powerful. Not ivar based. Monday, November 14, 11
  7. But Why Structs? Convenient Alternative. Attribute Methods With [] &

    []= Can Be Powerful. Not ivar based. Easy Enumeration Of Attribute Data. Monday, November 14, 11
  8. But Why Structs? Convenient Alternative. Attribute Methods With [] &

    []= Can Be Powerful. Not ivar based. Easy Enumeration Of Attribute Data. Default Equality On All Attributes. Monday, November 14, 11
  9. Attribute Accessors class Person < Struct.new(:name) def name parts =

    self[:name].to_s.split(' ') capped_parts = parts.map { |x| x.capitalize } capped_parts.join(' ') end end p = Person.new "KEN coLLins" p.name # => "Ken Collins" p[:name] = 'mETAskiLLs' p.name # => "Metaskills" Monday, November 14, 11
  10. Easy Enumeration Customer = Struct.new(:name, :address, :zip) joe = Customer.new("Joe

    Smith", "123 Maple, Anytown NC", 12345) joe.each { |x| x } # >> Joe Smith # >> 123 Maple, Anytown NC # >> 12345 joe.each_pair { |name, value| puts("#{name} => #{value}") } # >> name => Joe Smith # >> address => 123 Maple, Anytown NC # >> zip => 12345 Monday, November 14, 11
  11. Default Attribute Equality Customer = Struct.new(:name, :address, :zip) joe =

    Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) joejr = Customer.new("Joe Smith", "123 Maple, Anytown NC", 12345) jane = Customer.new("Jane Doe", "456 Elm, Anytown NC", 12345) joe == joejr #=> true joe == jane #=> false Monday, November 14, 11