`if __name__ == '__main __'`루비에서 동일


101

저는 Ruby를 처음 사용합니다. 별도로 계속 사용하려는 도구가 포함 된 모듈에서 함수를 가져 오려고합니다. 파이썬에서는 간단히 이렇게합니다.

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

이 날 프로그램을 실행하거나 사용하는 모듈로 가져올 수 있습니다 a()및 / 또는 b()별도. Ruby에서 동등한 패러다임은 무엇입니까?



답변:


130

내가 야생에서 본 Ruby에서 (톤이 아니라 허용) 이것은 표준 Ruby 디자인 패턴이 아닙니다. 모듈과 스크립트는 분리되어 있어야하므로이 작업을 수행하는 훌륭하고 깨끗한 방법이 없다고해도 놀라지 않을 것입니다.

편집 : 찾았습니다.

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

그러나 그것은 확실히 일반적이지 않습니다.


4
호기심에서 벗어나 모듈과 스크립트를 분리하는 이유는 무엇입니까?
Imagist

5
나는 그것이 루비 스트들이 선호하는 일이라고 생각합니다. 모듈 정의는 모듈 정의입니다. 해당 모듈로 어떤 조치를 취하고 싶다면 괜찮지 만 취하고있는 조치 는 모듈 정의 가 아닙니다 .
Matchu 2010

8
하지만 테스트에는 편리합니다. 모듈 테스트를 거기에 넣고 래퍼없이 모듈 파일에서 실행할 수 있습니다.
ebneter 2010

3
@Imagist 및 @ebneter 또는 그 반대 : 스크립트는 명령 줄에서 실행되도록 의도 된 단일 모듈이지만 부분적으로 테스트하고 별도의 모듈에서 테스트 할 수도 있습니다. 이 경우 NAME == $ 0은 매우 중요합니다.
혼란

16
나는 이것도 보지 못했지만 눈살을 찌푸 리지 않았습니다. 공식 Ruby 문서에서 사용합니다 : ruby-lang.org/en/documentation/quickstart/4
cflewis

12

스택 트레이스가 비어 있으면 오른쪽과 왼쪽으로 실행할 수 있습니다. 약 1 주일 동안 Ruby를 사용했기 때문에 그것이 관습 적으로 사용되는지 또는 비 관습 적으로 사용되었는지 모르겠습니다.

if caller.length == 0
  # do stuff
end

개념의 증거:

파일 : test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"

파일 : shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

용법:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

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

Rubocop 이 이것 보다 선호 합니다.

if __FILE__ == $0
    foo()
    bar()
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.