2013-05-18 20 views
10

__FILE__ ve __LINE__ sabitleri, yürütme altındaki geçerli dosya ve satır numaraları ile dinamik olarak güncelleştiriliyor gibi görünüyor, davranış Ruby'de nasıl uygulandığını merak ediyorum?__LINE__ ve __FILE__ sabitleri Ruby'de nasıl uygulanır?

Kaynak kodunu kestirdim ama __LINE__ ve __FILE__ görünüm için çok fazla ses var, herkesin kaynak kodunu göstermeme ve davranışını anlamak için bir ipucu vermesine yardımcı olabileceğini merak ediyorum.

Rubinis veya MRI'da açıklanan bilgiler iyi olacaktır. Hem __FILE__ ve __LINE__

+2

Belki de kaynaklara bir göz atın? –

+1

Neden düşüş var? Bana iyi bir soru gibi görünüyor. –

+1

@CodyCaughlan: İlgili dosya/satıra işaret edebilir misiniz? Kendimi merak ediyorum :) –

cevap

10

değişmezleri directly in the parser ile yer değiştirirler:

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)); 

Başka bir deyişle, onlar çıkan dize yazılan sanki tam davranırlar ya da kendini numara.

Not: __LINE__ için, bu doesn't always behave how you'd expect.

+0

Blog bağlantısı için teşekkürler :) –

+0

@hammar Kaynak kodu için teşekkürler. Ben ayrıştırıcı ile aşina değilim, hem '__FILE__' ve' __LINE__' statik işlev 'gettable_gen' denir. ** Her zamankinden ** '__LINE__' ruby ​​den,' NEW_STR() 'dinamik değer üretmek için çağrılır mı? – steveyang

+0

@ steven.yang: Hayır, ayrıştırma sadece dosya yüklendiğinde bir kez gerçekleşir. Bundan sonra __LINE__' için "çağrı" yoktur. Bundan sonra sadece sabitler var. Programınızı çalıştırmadan önce, ruby ​​dosyanızın içinden geçen bir arkadaşınıza vermişsiniz ve dosya adının her bir '__FILE__' örneğini el ile değiştirmişsiniz ve her bir' __LINE__ 'ifadesinin satır numarasıyla elinize geçmesini sağlayın. yerine ruby ​​içine dosya. – hammar