看看這個:尋找可疑接受塊讀取/分配實例變量
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
方法?
看看這個:尋找可疑接受塊讀取/分配實例變量
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
方法?
你可以使用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"
你可以如下操作:
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"
它比'instance_eval'好嗎? –
@SergioTulentsev這是一個辯論...... :)我可以問你反向的方式也.. –
什麼:
foo_instance.instance_variable_set '@some_ivar', 'bar'
foo_instance.secret
=> "bar"
的組合#instance_variables
,#instance_variable_get
和#instance_variable_set
都是爲了這個。
我不喜歡這種表示法,這就是爲什麼我很好奇,如果一個更好看的實現存在。此外,其他建議允許我在其他對象的上下文中執行該塊,以及將來的時間,其中instance_variable_set不會。 –
這取決於你想要什麼。順便說一下,不需要實施。 'instance eval'在'BasicObject'上定義。所以你可以做'whatever_object.instance_eval'。 – nicooga
這可能不是最通用的解決方案,但這個問題並沒有對多功能性進行補償。僅僅設置一個實例變量 - 請求的內容 - 我不認爲需要超越'instance_variable_set'。 –
+1擊敗我吧。 –
+1也打我。 – Linuxios
今天我感覺很幸運:) –