1. Ruby’s Struct Class
typdef struct { int id; char *name; } Awesome;
Ken Collins
metaskills.net
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
8. But Why Structs?
Convenient Alternative.
Attribute Methods With [] & []=
Can Be Powerful. Not ivar based.
Monday, November 14, 11
9. But Why Structs?
Convenient Alternative.
Attribute Methods With [] & []=
Can Be Powerful. Not ivar based.
Easy Enumeration Of Attribute Data.
Monday, November 14, 11
10. 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
11. 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
12. 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
13. 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
14. Thanks!
Ken Collins
metaskills.net
Monday, November 14, 11