2011-03-07 14 views
2

我一直在使用Ruby一年以下,但我仍然不完全理解「是什麼讓塊打勾」。特別是我很好奇在一個街區範圍內有多少控制。例如,說我有這樣的代碼:如何修改傳遞給塊的作用域?

class Blob 
    attr_accessor :viscosity 
    def configure(&:block) 
    block.call self 
    end 
end 

blob = Blob.new 
blob.configure do |b| 
    b.viscosity 0.5 
end 

顯然有一個人爲的例子。

現在,我從Rails 2移植到Rails 3時注意到的一件事是,它們的許多配置方法不再採用非阻塞參數。

例如,在routes.rb中,它曾經是ActionController::Routing::Routes.draw do |map| ... end,現在它只是ActionController::Routing::Routes.draw do ... end。但是塊內部調用的方法仍然具有適當的上下文,而不需要反覆重複塊的參數名稱。

在我上面的例子,那麼,我希望能夠做到:

blob.configure do 
    viscosity 0.5 
end 

,這樣我可以告訴人們是多麼容易寫在Ruby DSL。 :)

回答

4

這使用instance_eval做魔術。有關文檔,請參閱http://apidock.com/ruby/Object/instance_eval/instance_eval評估接收者上下文中的塊(或字符串)。

def configure(&block) 
    self.instance_eval &block 
end 

你仍然必須使用存取方法viscosity=在你的榜樣塊或者你必須在你的類定義

def viscosity(value) 
    @viscosity = value 
end