`if __name__ == '__main __' 'tương đương trong Ruby


101

Tôi mới làm quen với Ruby. Tôi đang tìm cách nhập các chức năng 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ỉ cần làm điều này:

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

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



Câu trả lời:


130

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

CHỈNH SỬA: Đã tìm thấy nó.

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

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


4
Lý do đằng sau việc giữ các mô-đun và tập lệnh tách biệt, vì tò mò là gì?
Imagist

5
Tôi nghĩ đó chỉ là điều mà những người theo chủ nghĩa Ruby thích làm. Một định nghĩa mô-đun là một đị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 đó, tốt thôi, nhưng hành động bạn đang thực hiện không phải là định nghĩa mô-đun.
Matchu

8
Tuy nhiên, nó rất tiện dụng để kiểm tra mọi thứ - bạn có thể đặt các bài kiểm tra mô-đun vào đó và chạy chúng chỉ từ tệp mô-đun mà không cần bất kỳ trình bao bọc nào.
ebneter

3
@Imagist và @ebneter Hoặc ngược lại: tập lệnh là một mô-đun duy nhất được thiết kế để chạy từ dòng lệnh, nhưng bạn cũng muốn có thể kiểm tra nó theo từng phần và kiểm tra trong một mô-đun riêng biệt. Trong trường hợp đó, NAME == $ 0 là vô giá.
Nhầm lẫn

16
Tôi cũng chưa nhìn thấy điều này, nhưng nó không phải là khó chịu. Các tài liệu chính thức của Ruby sử dụng nó: ruby-lang.org/en/documentation/quickstart/4
cflewis

12

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

if caller.length == 0
  # do stuff
end

Bằng chứng của khái niệm:

tệp: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

tệp: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Sử dụng:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

1
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

được Rubocop ưa thích hơn điều này:

if __FILE__ == $0
    foo()
    bar()
end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.