Niels B.
Niels B.

Reputation: 6310

Accept block that reads/assigns instance variables

Consider this:

class Foo
  def secret
    @some_ivar
  end    
end

foo_instance = Foo.new

foo_instance.in_foos_context do
  @some_ivar = "bar"
end

foo_instance.secret
=> "bar"

Aside from looking dubious, is this possible? If so, how do I implement the in_foos_context method?

Upvotes: 1

Views: 74

Answers (3)

ichigolas
ichigolas

Reputation: 7725

What about:

foo_instance.instance_variable_set '@some_ivar', 'bar'
foo_instance.secret
=> "bar"

The combo #instance_variables,#instance_variable_get and #instance_variable_set are meant for this.

Upvotes: 1

Arup Rakshit
Arup Rakshit

Reputation: 118271

You could do as below :

class Foo
  def secret
    @some_ivar
  end
  def in_foos_context(arg,&block)
    instance_exec(arg,&block)
  end    
end

foo_instance = Foo.new

foo_instance.in_foos_context("bar") do |v|
  @some_ivar = v
end

foo_instance.secret
# => "bar"

Upvotes: 0

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230346

You could use instance_eval

class Foo
  def secret
    @some_ivar
  end    

  def in_foos_context(&block)
    instance_eval(&block)
  end
end

foo_instance = Foo.new

foo_instance.in_foos_context do
  @some_ivar = "bar"
end

foo_instance.secret # => "bar"

Upvotes: 5

Related Questions