Slide 1

Slide 1 text

5 questions about Ruby instance v@riables Enrique Mogollan @mogox Software Engineer - Desk.com

Slide 2

Slide 2 text

1. What are instance variables? class User def initialize(name, email) @name = name @email = email end end puts User.new("Peter", "[email protected]").instance_variables @name @email

Slide 3

Slide 3 text

class User def initialize(name, email) @name = name @email = email end def to_s "Name: #{@name}" End def send_notification notification.push(@name, @email) end end

Slide 4

Slide 4 text

2. Why so many @?

Slide 5

Slide 5 text

Why so many @? class User def initialize(name, email) @name = name @email = email end def to_s "Name: #{@name}" End def send_notification notification.push(@name, @email) end end

Slide 6

Slide 6 text

Why so many @? class User ... def name @name end def email @email end def send_notification notification.push(name, email) end end

Slide 7

Slide 7 text

Why so many @? class User ... attr_reader :name, :email def send_notification notification.push(name, email) end end

Slide 8

Slide 8 text

class User attr_accessor :name, :email ... End > user = User.new("Peter Barker", "[email protected]") > puts user.name "Peter Barker" > user.name = "Peter Parker" > puts user "Peter Parker" Why so many @?

Slide 9

Slide 9 text

3. Why instance v@rs confusing?

Slide 10

Slide 10 text

Why are instance v@rs confusing? class User def initialize(name, dob) @name = name @dob = dob calculate_age end def to_s "Name #{@name}, Age: #{@age}" end private def calculate_age @age = dob_to_age(@dob) end end

Slide 11

Slide 11 text

Why are instance v@rs confusing? class User attr_accessor :name, :dob, :age def initialize(name, dob) @name = name @dob = dob calculate_age end def to_s "Name #{name}, Age: #{age}" end private def calculate_age age = dob_to_age(dob) end end

Slide 12

Slide 12 text

class User attr_accessor :name, :dob, :age def initialize(name, dob) @name = name @dob = dob calculate_age end def to_s "Name #{name}, Age: #{age}" end private def calculate_age age = dob_to_age(dob) # this is not an instance var end end

Slide 13

Slide 13 text

class User def age @age end def age=(value) @age = value end def to_s "Name #{name}, Age: #{age}" end private def calculate_age age = dob_to_age(dob) # age is a local var end end

Slide 14

Slide 14 text

class User def age @age end def age=(value) @age = value end def to_s "Name #{name}, Age: #{age}" end private def calculate_age self.age = dob_to_age(dob) # this sends a message to self end end

Slide 15

Slide 15 text

class User def age @age end def age=(value) @age = value end def to_s "Name #{name}, Age: #{age}" end private def calculate_age @age = dob_to_age(dob) # ignores the method end end

Slide 16

Slide 16 text

class User attr_accessor :age # Get the instance variable value def to_s "Age: #{age}" "Age: #{self.age}" "Age: #{@age}" end private # Set the instance variable value def calculate_age age = dob_to_age(dob) # creates a local var self.age = dob_to_age(dob) # sends a message @age = dob_to_age(dob) # ignores the method end end Why are instance v@rs confusing?

Slide 17

Slide 17 text

class User def age @age end def age=(value) @age = value end def to_s "Name #{name}, Age: #{age}" end private def calculate_age age = dob_to_age(dob) # Why age = doesn’t # set the instance variable? end end

Slide 18

Slide 18 text

That is how Ruby works… however 4. How does YARV works for v@riable assignations?

Slide 19

Slide 19 text

compiled = RubyVM::InstructionSequence.compile(code) puts compiled.disasm A trick learned from “Ruby Under a Microscope” http://patshaughnessy.net/ruby-under-a-microscope Get YARV instructions

Slide 20

Slide 20 text

# age = == disasm: >======= local table (size: 2, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, keyword: 0@3] s1) [ 2] age 0000 trace 8 ( 13) 0002 trace 1 ( 14) 0004 putself 0005 opt_send_simple 0007 dup 0008 setlocal_OP__WC__0 2 0010 trace 16 ( 15) 0012 leave ( 14) # self.age = == disasm: >======= 0000 trace 8 ( 13) 0002 trace 1 ( 14) 0004 putnil 0005 putself 0006 putself 0007 opt_send_simple 0009 setn 2 0011 opt_send_simple 0013 pop 0014 trace 16 ( 15) 0016 leave ( 14) # @age = == disasm: >======= 0000 trace 8 ( 13) 0002 trace 1 ( 14) 0004 putself 0005 opt_send_simple 0007 dup 0008 setinstancevariable :@age, 0011 trace 16 ( 15) 0013 leave

Slide 21

Slide 21 text

age = calculate_age local table (size: 2, argc: ...) 0008 setlocal_OP__WC__0 2 @age = calculate_age 0008 setinstancevariable :@age, self.age = calculate_age 0011 opt_send_simple How ruby parses v@riable setting?

Slide 22

Slide 22 text

5. How do I usually interact with instance v@rs?

Slide 23

Slide 23 text

I use accessors (YARV optimized methods) class User attr_accessor :name def to_s "Name #{name}" end end

Slide 24

Slide 24 text

I send messages class User attr_accessor :name def to_s "Name #{name}, Age: #{age}" end ... private def age @age ||= dob_to_age(dob) end end

Slide 25

Slide 25 text

Ruby is an OO language We like sending messages https://twitter.com/mogox