ruby struct
DESCRIPTION
Using Ruby's Struct Class.TRANSCRIPT
Ruby’s Struct Class
Ken Collinsmetaskills.net
typdef struct { int id; char *name; } Awesome;
Monday, November 14, 11
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
Ad Hoc ExampleLanguage = Struct.new(:name, :class_based)
ruby = Language.new "Ruby", truejs = Language.new "JavaScript", falseobjc = Language.new "Objective-C"
ruby # => #<struct Language name="Ruby", class_based=true>js # => #<struct Language name="JavaScript", class_based=false>
ruby.class_based # => truejs.class_based # => false
objc.class_based = trueobjc.class_based # => true
Monday, November 14, 11
Sub Class Example
class MyObject < Struct.new(:id, :name, :key) end
o = MyObject.new # => #<struct MyObject id=nil, name=nil, key=nil>
o.id # => nilo.name # => nil
o.id = 12345o.name = "Test Object"
o # => #<struct MyObject id=12345, name="Test Object", key=nil>
Monday, November 14, 11
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 # => 12345o.name # => "Test Object"
Monday, November 14, 11
But Why Structs?
Monday, November 14, 11
But Why Structs?Convenient Alternative.
Monday, November 14, 11
But Why Structs?Convenient Alternative.Attribute Methods With [] & []= Can Be Powerful. Not ivar based.
Monday, November 14, 11
But Why Structs?Convenient Alternative.Attribute Methods With [] & []= Can Be Powerful. Not ivar based.Easy Enumeration Of Attribute Data.
Monday, November 14, 11
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
Attribute Accessorsclass 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
Easy EnumerationCustomer = 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
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 #=> truejoe == jane #=> false
Monday, November 14, 11
Thanks!Ken Collins
metaskills.net
Monday, November 14, 11