2010-02-12 28 views
84

Tôi mới dùng Ruby. Tôi đang tìm cách nhập các hàm từ một mô-đun có chứa công cụ mà tôi muốn tiếp tục sử dụng riêng. Trong Python tôi chỉ đơn giản sẽ làm điều này:`if __name__ == '__main __'` tương đương trong Ruby

def a(): 
    ... 
def b(): 
    ... 
if __name__ == '__main__': 
    a() 
    b() 

này cho phép tôi để chạy chương trình hoặc nhập khẩu nó như là một mô-đun để sử dụng a() và/hoặc b() riêng. Mô hình tương đương trong Ruby là gì?

+0

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) –

Trả lời

111

Từ Ruby tôi đã thấy trong tự nhiên (được cấp, không phải là tấn), đây không phải là mẫu thiết kế chuẩn của Ruby. Các mô-đun và tập lệnh được cho là tách biệt, vì vậy tôi sẽ không ngạc nhiên nếu không thực sự là một cách làm tốt, sạch sẽ.

EDIT:Found it.

if __FILE__ == $0 
    foo() 
    bar() 
end 

Nhưng nó chắc chắn là không phổ biến.

+4

Lý do đằng sau việc giữ gìn mô-đun và tập lệnh riêng biệt, ngoài tò mò? – Imagist

+4

Tôi nghĩ đó chỉ là những gì người Ruby thích làm. Định nghĩa mô-đun là định nghĩa mô-đun. Nếu bạn muốn thực hiện một số hành động với mô-đun đó, thì tốt, nhưng hành động bạn đang dùng * không phải là * định nghĩa mô-đun. – Matchu

+7

Thật tiện dụng, mặc dù, để thử nghiệm mọi thứ - bạn có thể đặt các kiểm tra mô-đun trong đó và chạy chúng chỉ từ tệp mô-đun mà không có bất kỳ trình bao bọc nào. – ebneter

8

Nếu ngăn xếp ngăn xếp trống, chúng tôi có thể bắt đầu thực hiện ở bên phải và bên trái. Tôi không biết nếu nó được sử dụng thông thường hay độc đáo kể từ khi tôi vào Ruby khoảng một tuần.

if caller.length == 0 
    # do stuff 
end 

Bằng chứng về khái niệm:

file: test.rb

#!/usr/bin/ruby                 

if caller.length == 0 
    puts "Main script" 
end 

puts "Test" 

file: shmest.rb

#!/usr/bin/ruby -I .                

require 'test.rb' 

puts "Shmest" 

Cách sử dụng:

$ ./shmest.rb 
Test 
Shmest 

$ ./test.rb 
Main script 
Test 
Các vấn đề liên quan