Slide 1

Slide 1 text

Ruby’s Struct Class Ken Collins metaskills.net typdef struct { int id; char *name; } Awesome; Monday, November 14, 11

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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 # => # js # => # ruby.class_based # => true js.class_based # => false objc.class_based = true objc.class_based # => true Monday, November 14, 11

Slide 4

Slide 4 text

Sub Class Example class MyObject < Struct.new(:id, :name, :key) end o = MyObject.new # => # o.id # => nil o.name # => nil o.id = 12345 o.name = "Test Object" o # => # Monday, November 14, 11

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

But Why Structs? Monday, November 14, 11

Slide 7

Slide 7 text

But Why Structs? Convenient Alternative. Monday, November 14, 11

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Thanks! Ken Collins metaskills.net Monday, November 14, 11