2013-10-31 17 views
1

看看這個:尋找可疑接受塊讀取/分配實例變量

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" 

除此之外,這可能嗎?如果是這樣,我該如何執行in_foos_context方法?

回答

5

你可以使用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" 
+0

+1擊敗我吧。 –

+0

+1也打我。 – Linuxios

+0

今天我感覺很幸運:) –

0

你可以如下操作:

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" 
+0

它比'instance_eval'好嗎? –

+0

@SergioTulentsev這是一個辯論...... :)我可以問你反向的方式也.. –

1

什麼:

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

的組合#instance_variables#instance_variable_get#instance_variable_set都是爲了這個。

+0

我不喜歡這種表示法,這就是爲什麼我很好奇,如果一個更好看的實現存在。此外,其他建議允許我在其他對象的上下文中執行該塊,以及將來的時間,其中instance_variable_set不會。 –

+0

這取決於你想要什麼。順便說一下,不需要實施。 'instance eval'在'BasicObject'上定義。所以你可以做'whatever_object.instance_eval'。 – nicooga

+0

這可能不是最通用的解決方案,但這個問題並沒有對多功能性進行補償。僅僅設置一個實例變量 - 請求的內容 - 我不認爲需要超越'instance_variable_set'。 –