`jika __name__ == '__main __' 'setara di Ruby


101

Saya baru mengenal Ruby. Saya ingin mengimpor fungsi dari modul yang berisi alat yang ingin saya terus gunakan secara terpisah. Dengan Python saya hanya akan melakukan ini:

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

Ini memungkinkan saya untuk menjalankan program atau mengimpornya sebagai modul untuk digunakan a()dan / atau b()secara terpisah. Apa paradigma yang setara di Ruby?



Jawaban:


130

Dari Ruby yang saya lihat di alam liar (memang, bukan satu ton), ini bukan pola desain Ruby standar. Modul dan skrip seharusnya tetap terpisah, jadi saya tidak akan terkejut jika tidak ada cara yang baik dan bersih untuk melakukan ini.

EDIT: Ketemu.

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

Tapi itu jelas tidak umum.


4
Apa alasan di balik memisahkan modul dan skrip, karena penasaran?
Imagist

5
Saya pikir itu yang lebih suka dilakukan oleh Rubyist. Definisi modul adalah definisi modul. Jika Anda ingin mengambil tindakan dengan modul itu, baiklah, tetapi tindakan yang Anda lakukan bukanlah definisi modul.
Matchu

8
Ini berguna, meskipun, untuk menguji berbagai hal - Anda dapat menempatkan tes modul di sana dan menjalankannya hanya dari file modul tanpa pembungkus apa pun.
ebneter

3
@Imagist dan @ebneter Atau sebaliknya: skrip adalah modul tunggal yang dimaksudkan untuk dijalankan dari baris perintah, tetapi Anda juga ingin dapat mengujinya di beberapa bagian dan melakukan pengujian dalam modul terpisah. Dalam hal ini, NAME == $ 0 sangat berharga.
Kebingungan

16
Aku juga belum pernah melihat ini, tapi tidak disukai. Dokumen resmi Ruby menggunakannya: ruby-lang.org/en/documentation/quickstart/4
cflewis

12

Jika jejak tumpukan kosong, kita bisa mulai mengeksekusi ke kanan dan kiri. Saya tidak tahu apakah itu digunakan secara konvensional atau tidak konvensional karena saya menggunakan Ruby selama sekitar satu minggu.

if caller.length == 0
  # do stuff
end

Bukti dari konsep:

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"

Pemakaian:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

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

lebih disukai oleh Rubocop daripada ini:

if __FILE__ == $0
    foo()
    bar()
end
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.