2013-05-18 3 views
10

Кажется, что константы __FILE__ и __LINE__ динамически обновляются текущим текущим номером файла и строки, мне интересно, как поведение, реализованное в Ruby?Как константы __LINE__ и __FILE__ реализованы в Ruby?

Я скопировал исходный код, но есть слишком много шумов для внешнего вида __LINE__ и __FILE__. Мне интересно, кто-нибудь может помочь мне указать на исходный код и дать ключ к пониманию его поведения.

Пояснение в Rubinis или MRI будет в порядке.

+2

Возможно, посмотрите на источник? –

+1

Почему downvote? Мне кажется хорошим вопросом. –

+1

@CodyCaughlan: можете ли вы указать на соответствующий файл/строку? Мне самому любопытно :) –

ответ

10

Оба __FILE__ и __LINE__ заменяются на литералов 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)); 

Другими словами, они ведут себя так, как если бы вы ввели в результирующую строку или номер самостоятельно.

Отметьте, что для __LINE__ этот doesn't always behave how you'd expect.

+0

Спасибо за ссылку в блоге :) –

+0

@hammar Спасибо за исходный код. Я не знаком с парсером, и из __FILE__' и '__LINE__' вызывается из статической функции' gettable_gen'. Это означает ** каждый раз ** '__LINE__' вызывается из ruby, вызывается' NEW_STR() 'для генерации динамического значения? – steveyang

+0

@ steven.yang: Нет, разбор происходит только один раз, когда ваш файл загружен. После этого нет «вызова» для '__LINE__'. С тех пор все это просто константы. Это похоже на то, что до того, как вы запустили свою программу, вы передали свой рубиновый файл другу, который прошел через него, и вручную заменил каждое вхождение '__FILE__' именем файла и каждым вхождением' __LINE__' номером строки, а затем вы загрузили этот файл вместо рубина. – hammar

Смежные вопросы