$30 off During Our Annual Pro Sale. View Details »

5 Questions about instance variables

5 Questions about instance variables

What are instance variables? Why are instance variables confusing?

Enrique Carlos Mogollan

August 02, 2016
Tweet

More Decks by Enrique Carlos Mogollan

Other Decks in Programming

Transcript

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

    View Slide

  2. 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

    View Slide

  3. 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

    View Slide

  4. 2. Why so many @?

    View Slide

  5. 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

    View Slide

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

    View Slide

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

    View Slide

  8. 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 @?

    View Slide

  9. 3. Why instance v@rs confusing?

    View Slide

  10. 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

    View Slide

  11. 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

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. 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?

    View Slide

  17. 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

    View Slide

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

    View Slide

  19. 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

    View Slide

  20. # 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

    View Slide

  21. 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?

    View Slide

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

    View Slide

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

    View Slide

  24. 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

    View Slide

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

    View Slide