2010-02-11 9 views
9

Nie znam prawidłowej terminologii. Próbowałem google i nie mogłem znaleźć nic z tego powodu.Przepisanie prostej funkcji ruby ​​do użycia bloku

Piszę biblioteki Ruby i chcę przepisać funkcje więc działają one jak poniżej jako wolę go dla czytelności (wewnątrz bloku?)

Mam funkcję, która robi to

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

Chcę przerobić go tak działa tak

Dwg.new("test.dwg") do 

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

end 

można przedstawić tak, jak iść na ten temat?

+1

Metoda zwana 'zapisz' może być przydatna, jeśli jesteś nie używać bloku, ale czy nie jest to zbędne, jeśli korzystasz z bloku? –

+0

Dobra uwaga, zwłaszcza, że ​​przekazuję nazwę pliku do funkcji – ADAM

Odpowiedz

15

Można zdefiniować inicjator Dwg „s wziąć blok, a następnie poddać się tym bloku z instance_eval, tak:

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 

Aby uzyskać więcej informacji, zobacz«Bloki Interfejs uproszczenia»sekcji w Niedawno na licencji Creative Commons Commons: Chapter 2 z doskonałej książki Gregory'ego Browna Ruby Best Practices. (Jego autor i wydawca stopniowo przekierowują całą sprawę, ale oczywiście nadal można kupić kopię, aby wesprzeć pracę.) Wersja na iPhone'a jest szczególnie przystępna.)

+0

dzięki, doskonale! – ADAM

+11

Pamiętaj, aby zmienić wiersz 'instance_eval & block' na' instance_eval & block if block_given? 'Jeśli nadal chciałbyś obsłużyć przypadek, w którym' new' jest wywoływany bez bloku, w przeciwnym razie otrzymasz 'ArgumentError: block not supplied' when you zrobić. – mikej

Powiązane problemy