Reputation: 6310
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
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
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
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