2010-02-11 13 views
9

Non conosco la terminologia corretta. Ho provato a google e non ho trovato nulla per questo motivo.Riscrivere la funzione rubino semplice per utilizzare un blocco

sto scrivendo una libreria Ruby, e voglio riscrivere le funzioni in modo da lavorare, come di seguito come preferisco per la leggibilità (all'interno di un blocco?)

Ho una funzione che fa questo

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

voglio riscriverlo in modo che funziona in questo modo

Dwg.new("test.dwg") do 

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

end 

Riesci a descrivere il mio modo di andare su questo?

+1

Un metodo chiamato 'save' può essere utile se sei non utilizzare un blocco, ma non è ridondante se si utilizza un blocco? –

+0

buon punto, soprattutto perché sto passando il nome del file alla funzione – ADAM

risposta

15

È possibile definire initializer s' Dwg di prendere un blocco, e poi cedere a quel blocco con instance_eval, in questo modo:

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 

Per ulteriori informazioni, vedere la sezione 'Blocchi per l'interfaccia semplificazione' sezione nel recentemente concesso in licenza Creative Commons n. Chapter 2 dell'eccellente libro Ruby Best Practices di Gregory Brown. (L'autore e l'editore stanno gradualmente eseguendo l'intera operazione, ma è comunque possibile acquistarne una copia per supportare il lavoro.L'edizione dell'iPhone è particolarmente conveniente.)

+0

grazie, perfetto! – ADAM

+11

Assicurati di cambiare la riga 'instance_eval & block' in' instance_eval & block if block_given? 'Se vuoi ancora supportare il caso in cui' new' viene chiamato senza un blocco altrimenti otterrai 'ArgumentError: block not supplied' quando tu fare. – mikej

Problemi correlati