2013-05-18 12 views
10

Wydaje się, że stałe __FILE__ i __LINE__ są dynamicznie aktualizowane z bieżącym plikiem i numerami linii w trakcie wykonywania, zastanawiam się, w jaki sposób jest zaimplementowane zachowanie w Ruby?W jaki sposób zaimplementowane w Ruby są stałe __LINE__ i __FILE__?

Poszukałem kodu źródłowego, ale jest zbyt wiele odgłosów dla pojawienia się __LINE__ i __FILE__, jestem ciekawy, każdy może mi pomóc wskazać kod źródłowy i dostarczyć wskazówek, aby zrozumieć jego zachowanie.

Objaśnienie w Rubinis lub MRI będzie w porządku.

+2

Może zajrzeć do źródła? –

+1

Dlaczego upadek? To dla mnie dobre pytanie. –

+1

@CodyCaughlan: czy możesz wskazać odpowiedni plik/linię? Jestem ciekawy sam :) –

Odpowiedz

10

Zarówno __FILE__ i __LINE__ zastępowane przez literałów directly in the parser:

case keyword__FILE__: 
    return NEW_STR(rb_external_str_new_with_enc(ruby_sourcefile, strlen(ruby_sourcefile), 
               rb_filesystem_encoding())); 
case keyword__LINE__: 
    return NEW_LIT(INT2FIX(tokline)); 

Innymi słowy, zachowują się dokładnie tak, jak gdyby były wpisywane w wynikowym ciągu znaków lub samodzielnie.

Należy pamiętać, że dla __LINE__ ten doesn't always behave how you'd expect.

+0

Dzięki za link do bloga :) –

+0

@hammar Dzięki za kod źródłowy. Nie znam parsera, zarówno '__FILE__' i' __LINE__' są wywoływane z funkcji statycznej 'gettable_gen'. Czy to znaczy ** za każdym razem ** '__LINE__' jest wywoływane z ruby,' NEW_STR() 'jest wywoływane w celu wygenerowania wartości dynamicznej? – steveyang

+0

@ steven.yang: Nie, parsowanie następuje tylko raz, gdy plik zostanie załadowany. Po tym nie ma "połączenia" z '__LINE__'. Od tego momentu wszystkie są tylko stałymi. To tak, jakby przed uruchomieniem programu podałeś swój plik ruby ​​znajomemu, który go przeszedł i ręcznie zastąpił każde wystąpienie '__FILE__' nazwą pliku i każdym wystąpieniem' __LINE__' z numerem linii, a następnie załadowałeś to zamiast tego wklej plik do ruby. – hammar

Powiązane problemy