2011-05-25 21 views
12

Ruby/Oniguruma'da sadece 4 göründükte eşdeğer ifadelerden sadece birinde mevcut bir yan etki fark ettim. 009'da tanımlanmış olan ancak 003, 005 veya veya 007 değişkenleri neden?Neden = ~ operatörünün bazen yan etkileri oluyor?

irb(main):001:0> r = /(?<day>\d\d):(?<mon>\d\d)/ 
=> /(?<day>\d\d):(?<mon>\d\d)/ 

irb(main):002:0> r =~ "24:12" 
=> 0 
irb(main):003:0> day 
NameError: undefined local variable or method `day' 

irb(main):004:0> "24:12" =~ r 
=> 0 
irb(main):005:0> day 
NameError: undefined local variable or method `day' 


irb(main):006:0> "24:12" =~ /(?<day>\d\d):(?<mon>\d\d)/ 
=> 0 
irb(main):007:0> day 
NameError: undefined local variable or method `day' 


irb(main):008:0> /(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12" 
=> 0 
irb(main):009:0> day 
=> "24" 

nb # 1: Her dört durumda aynı regex ve aynı dize.

nb # 2: MS Windows ve Ubuntu Linux'taki davranışı doğruladım.

+2

Not: Buradaki durum bu olmamasına rağmen, IRb'de yerel değişkenlerle çalışırken dikkatli olmalısınız. IRb'de kodun, IRb'de değerlendirilme biçiminden dolayı biraz daha farklı davranabilirler. Her zaman onaylamak için komut dosyaları yazın. –

+0

İyi nokta, Jörg. –

cevap

13

"24:12" =~ r numaralı telefonu aradığınızda, aslında "24:12".=~(r) numaralı telefonu arayabilirsiniz. Yani, String#=~ sadece maçın başladığı pozisyonu döndürür veya eşleşme yoksa sıfırdır.

, yakalanan dizeleri sen aslında Regexp#=~

çağrı /(?<day>\d\d):(?<mon>\d\d)/ =~ "24:12" çağırdığınızda Ve dokümantasyon

söylediği gibi = ~ adlı yakalar ile değişmez bir Normal ifadeyle kullanılırsa Ama (veya sıfır) 'dir yakalama adları tarafından adlandırılan yerel değişkenlerine atanmıştır.

003 ne hakkında: regexp'in bir hazır değilse

atama meydana değildir. regexp'in sağ tarafında yerleştirilirse

re = /(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/ 
    re =~ " x = y " 
    p lhs # undefined local variable 
    p rhs # undefined local variable 

ve

atama meydana değildir.
"x = y =" ~ /(?<lhs>\w+)\s*=\s*(?<rhs>\w+)/
s sol eksen RHS # tanımlanmamış yerel değişken I bu noktada Rubyland tam şişmiş Normal ifade nesne ile muhtemelen, çünkü 003 desteklenmez inanıyoruz

+0

Teşekkürler Nash. Çok iyi bir cevap. Ama aynı zamanda sorudaki 003'ü de açıklayabilirsiniz - yani derlenmiş bir regex (regex edebi değil) '= ~' mesajını alır ve yerel değişkeni alamaz. –

+0

Bir şey değil! Güncellemeye bakın. –

+1

"Yakalanan dizeler atanmış ...", "Ödev oluşmuyor ..."? Garip dilbilgisi ... –

1

geçersiz kılınmış yöntemler ve benzerleri. Bu, atanan yerlerin kapsamını çok daha karmaşık hale getirir.

+0

Teşekkürler, James.Ruby içerik oluşturucularının niyeti hakkında başka bir fikrim vardı, ama muhtemelen teknik bir sorun olduğu konusunda haklısınız. –