Ruby'de __name__ == '__main __' 'eşdeğeri


102

Ruby'de yeniyim. Ayrı olarak kullanmaya devam etmek istediğim bir araç içeren bir modülden işlevleri içe aktarmak istiyorum. Python'da şunu yapardım:

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

Bu, programı çalıştırmama veya kullanmak üzere a()ve / veya b()ayrı ayrı modül olarak içe aktarmama izin veriyor . Ruby'deki eşdeğer paradigma nedir?



Yanıtlar:


132

Doğada gördüğüm Ruby'den (bir ton değil), bu standart bir Ruby tasarım kalıbı değil. Modüllerin ve komut dosyalarının ayrı kalması gerekiyor, bu yüzden bunu yapmanın gerçekten iyi ve temiz bir yolu yoksa şaşırmam.

DÜZENLEME: Buldum.

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

Ama kesinlikle yaygın değil.


4
Meraktan, modülleri ve komut dosyalarını ayrı tutmanın ardındaki mantık nedir?
Imagist

5
Bence Rubyistlerin yapmayı tercih ettiği şey bu. Bir modül tanımı, bir modül tanımıdır. Bu modülle bir şeyler yapmak istiyorsanız, tamam, ancak yaptığınız eylem bir modül tanımı değildir .
Maç

8
Yine de, bir şeyleri test etmek için kullanışlıdır - modül testlerini oraya koyabilir ve bunları herhangi bir sarmalayıcı olmadan yalnızca modül dosyasından çalıştırabilirsiniz.
ebneter

3
@Imagist ve @ebneter Ya da tam tersi: betik, komut satırından çalıştırılması amaçlanan tek bir modüldür, ancak aynı zamanda onu parçalar halinde test edebilmek ve ayrı bir modülde testi yaptırmak istiyorsunuz. Bu durumda, NAME == $ 0 paha biçilemez.
Confusion

16
Bunu ben de görmedim ama hoş karşılanmadı. Resmi Ruby belgeleri bunu kullanıyor: ruby-lang.org/en/documentation/quickstart/4
cflewis

12

Yığın izleme boşsa, sağa ve sola çalışmaya başlayabiliriz. Ruby'yi yaklaşık bir haftadır kullandığım için bunun geleneksel mi yoksa geleneksel olmayan bir şekilde mi kullanıldığını bilmiyorum.

if caller.length == 0
  # do stuff
end

Kavramın ispatı:

dosya: test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

dosya: shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

Kullanım:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

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

Rubocop tarafından bunun yerine tercih edilmektedir :

if __FILE__ == $0
    foo()
    bar()
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.