2010-02-11 45 views
9

我不知道正確的術語。我試圖谷歌它,並找不到任何原因。重寫簡單的ruby函數以使用塊

我寫一個Ruby庫,我想重寫的功能,使他們下面的工作,因爲我喜歡它的可讀性(塊裏面?)

我做這個

@dwg = Dwg.new("test.dwg") 
@dwg.line([0,0,0],[1,1,0]) 
@dwg.save 
功能

我想重寫它,所以它是這樣工作的

Dwg.new("test.dwg") do 

    line([0,0,0],[1,1,0]) 
    save 

end 

你能概括我去對此方法是什麼?

+1

如果你喜歡不使用塊,但是如果使用塊,它不是多餘的嗎? – 2010-02-11 12:51:54

+0

好點,特別是因爲我通過文件名稱的功能 – ADAM 2010-02-12 00:21:00

回答

15

可以定義Dwg的初始化採取塊,然後得到該塊與instance_eval,像這樣:

class MyClass 
    def initialize(name, &block) 
    @name = name 
    instance_eval &block 
    end 

    def show_name 
    puts 'My name is ' + @name 
    end 
end 

MyClass.new('mud') do 
    show_name 
end 

# >> My name is mud 

有關詳細信息,請參閱‘塊用於接口簡化’中的節最近Creative-Commons-licensed Chapter 2格雷戈里布朗的優秀Ruby Best Practices書。 (它的作者和出版商正在逐漸收集整個東西,但你當然仍然可以購買一份來支持這項工作,iPhone版本特別實惠。)

+0

謝謝,完美! – ADAM 2010-02-11 09:01:21

+11

如果你仍然想支持'new'不帶塊的情況,那麼一定要修改'instance_eval&block'到'instance_eval&block if block_given?',否則當你遇到'ArgumentError:block not supplied'時做。 – mikej 2010-02-11 09:21:54