2012-02-27 22 views
7

instance_eval的方法改變自身在其塊,如:如何在像instance_eval方法這樣的塊中改變自我嗎?

class D; end 
d = D.new 
d.instance_eval do 
    puts self # print something like #<D:0x8a6d9f4>, not 'main'! 
end 

如果我們定義(這需要一個塊或任何其他方法(比instance_eval的除外)),在打印時的自我,我們將得到的主要的方法我們自己」,這是從instance_eval的method.eg不同:

[1].each do |e| 
    puts self # print 'main' 
end 

我怎樣才能限定的方法(其需要一個塊)等instance_eval的? 在此先感謝。

+0

做什麼你想達到什麼目的? – megas 2012-02-27 06:54:34

+0

我不認爲有可能做你想做的事。可能是因爲如果你可以自己改變自己,那太過撲朔迷離了。 – 2012-02-27 21:31:13

回答

7

你可以寫一個接受PROC參數的方法,然後傳遞作爲參數proc instance_eval的。

class Foo 
    def bar(&b) 
    # Do something here first. 
    instance_eval &b 
    # Do something else here afterward, call it again, etc. 
    end 
end 

Foo.new.bar {把自我}

產量

#<Foo:0x100329f00> 
+0

我明白你的意思,但沒有解決我的問題。我想定義一個像instance_eval而不是使用instance_eval的方法。我想實現不是一個包裝。謝謝你們都一樣! – gaols 2012-02-27 07:58:15

+1

然後,您需要更具體地瞭解您想實現的目標。如果你只是想要一個可以接受塊的方法,然後在與你的方法相同的上下文中執行一次或多次,那麼這就做到了。如果我不得不猜測,也許你想將參數傳遞給塊?我知道這是可能的,因爲RSpec是這樣做的,而且這個例子確實沒有。我應該看看RSpec代碼,看看他們是如何做到的。 – 2012-02-27 08:17:48

+0

Actualy,我看到RSpec不會傳遞params來阻塞,並且它使用instance_eval來調用塊。請參閱http://rubydoc.info/gems/rspec-core/RSpec/Core/Example#run-instance_method並單擊「查看源代碼」。 – 2012-02-27 08:29:12

3

很明顯:

class Object 
    def your_method(*args, &block) 
    instance_eval &block 
    end 
end 

receiver = Object.new 

receiver.your_method do 
    puts self #=> it will print the self of receiver 
end 
+0

對不起,我想要的是一個方法,它需要一個塊,並在該塊自我更改爲接收器,就像instance_eval! – gaols 2012-02-27 07:54:25

+0

再次感謝您的幫助! – gaols 2012-02-27 14:13:05

相關問題