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

Ruby Struct

Ken Collins
April 11, 2012
570

Ruby Struct

Using Ruby’s Struct Class.

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