2011-06-23 24 views
8

Tôi muốn viết một kịch bản một cái gì đó của Ruby như thế này:Tôi có thể viết mã Ruby được thực hiện chỉ khi kịch bản của tôi được chạy, nhưng không phải khi nó được yêu cầu?

class Foo 
    # instance methods here 

    def self.run 
    foo = Foo.new 
    # do stuff here 
    end 
end 

# This code should only be executed when run as a script, but not when required into another file 
unless required_in? # <-- not a real Kernel method 
    Foo.run 
end 
# ------------------------------------------------------------------------------------------ 

Tôi muốn có thể cho đơn vị kiểm tra nó, đó là lý do tôi không muốn mã bên ngoài của lớp để chạy, trừ khi tôi thực hiện tập lệnh trực tiếp, tức là ruby foo_it_up.rb.

Tôi biết tôi có thể chỉ cần đặt lớp Foo vào một tệp khác và require 'foo' trong tập lệnh của tôi. Trong thực tế, đó có lẽ là một cách tốt hơn để làm điều đó, chỉ trong trường hợp chức năng của Foo là cần thiết ở một nơi khác. Vì vậy, câu hỏi của tôi là học thuật hơn bất cứ điều gì, nhưng tôi vẫn muốn được quan tâm đến việc biết làm thế nào để làm điều này trong Ruby.

+1

có thể trùng lặp của [Chạy thư viện Ruby từ dòng lệnh] (http://stackoverflow.com/questions/487086/run-a-ruby-library-from-the-command-line) - nhưng phải mất một số Googling nghiêm túc để tìm thấy nó! Tôi ngạc nhiên khi câu hỏi này không được hỏi thường xuyên hơn. –

+0

Andrew: Tương tự ở đây. Tôi hy vọng sẽ tìm thấy câu trả lời trên Stack Overflow! Cảm ơn vì sự giúp đỡ của bạn lần nữa. –

Trả lời

20

này thường được thực hiện với

if __FILE__ == $0 
    Foo.run 
end 

nhưng tôi thích

if File.identical?(__FILE__, $0) 
    Foo.run 
end 

vì chương trình như ruby-prof can make $0 not equal__FILE__ ngay cả khi bạn sử dụng --replace-progname.

$0 dùng để chỉ tên chương trình ($PROGRAM_NAME), trong khi __FILE__ là tên của tệp nguồn hiện tại.

+0

Rất thẳng về phía trước. Cảm ơn! –

Các vấn đề liên quan