2010-02-11 12 views
9

Tôi không biết thuật ngữ chính xác. Tôi đã cố gắng để google nó và không thể tìm thấy bất cứ điều gì vì lý do đó.Viết lại hàm ruby ​​đơn giản để sử dụng khối

Tôi viết một thư viện Ruby, và tôi muốn viết lại các chức năng để họ làm việc như dưới đây như là tôi thích nó để có thể đọc (bên trong một khối?)

Tôi có một chức năng mà thực hiện điều này

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

tôi muốn viết lại nó để nó hoạt động như thế này

Dwg.new("test.dwg") do 

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

end 

bạn có thể vạch ra những con đường tôi đi về điều này?

+1

Phương pháp gọi là 'save' có thể hữu ích nếu bạn không sử dụng một khối, nhưng không phải là nó dư thừa nếu bạn đang sử dụng một khối? –

+0

điểm tốt, đặc biệt là kể từ khi tôi chuyển tên tệp đến hàm – ADAM

Trả lời

15

Bạn có thể xác định initializer Dwg 's để có một khối, và sau đó chịu khuất phục trước khối với instance_eval, như vậy:

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 

Để biết thêm thông tin, hãy xem phần 'Blocks cho giao diện đơn giản hoá' trong gần đây Creative-Commons được cấp phép Chapter 2 trong cuốn sách xuất sắc nhất của Gregory Brown Ruby Best Practices. (Tác giả và nhà xuất bản của nó đang dần dần CCing toàn bộ điều, nhưng bạn có thể vẫn còn mua một bản sao để hỗ trợ công việc. Phiên bản iPhone đặc biệt có giá phải chăng.)

+0

cảm ơn, hoàn hảo! – ADAM

+11

Hãy chắc chắn thay đổi dòng 'instance_eval & block' thành' instance_eval & block' nếu block_given? 'Nếu bạn vẫn muốn hỗ trợ trường hợp' new' được gọi mà không có khối, nếu không bạn sẽ nhận được 'ArgumentError: khối không được cung cấp' khi bạn làm. – mikej