Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Store and retrieve variables from objects

Tags:

ruby

I want to store and retrieve some variables from object. For example in a

a = "a"

So far I found two possible ways to do it.

  • Using instance_variable_set and instance_variable_get

    a.instance_variable_set(:@x, 10)
    a.instance_variable_get(:@x) # => 10
    
  • or just using instance_eval

    a.instance_eval { @y = 5 }
    a.instance_eval { @y } # => 5
    

The second approach looks shorter and simpler for me, is there anything wrong with my code if I prefer this one?

like image 663
evfwcqcg Avatar asked Mar 07 '26 03:03

evfwcqcg


2 Answers

Speed isn't everything, but... the instance_variable_set method is faster than using instance_eval. Here's a benchmark if you're interested: https://gist.github.com/1268188

Here's another post that gives another good reason for avoiding instance_eval when possible: Alex Kliuchnikau on instance_eval

like image 64
Josh Voigts Avatar answered Mar 09 '26 17:03

Josh Voigts


If there is no good reason (e.g. metaprogramming), you'd better avoid using instance_variable_get(set), coz it will break encapsulation. You can refer to ruby-doc: thereby frustrating the efforts of the class’s author to attempt to provide proper encapsulation.

And the best practice of using instance_eval is to compose DSL style:

assume you have a Engineer class with instance method: program, play and sleep. So,

sb = Engineer.new

sb.program
sb.play
sb.sleep

# is equivalent to
sb.instance_eval do
  program
  play
  sleep
end

In this case, it's shorter :)

like image 38
Jing Li Avatar answered Mar 09 '26 19:03

Jing Li



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!