2013-06-18 21 views
9
anlamıyorum

ile eval neden böyle eval çalışır:Yakut: dize enterpolasyon

Ben eval içinde bir dizeye interpole nasıl
"123 #{456.to_s} 789" # => "123 456 789" 
eval('123 #{456.to_s} 789') # => 123 

?

Güncelleme:

, arkadaşlar teşekkür ederim. İşe yaradı. size daha sonra eval istediğiniz #{} bir dize değişkeni varsa aşağıda açıklandığı gibi

Yani, bunu yapmak gerekir:

string = '123 #{456} 789' 
eval("\"" + string + "\"") 
# => 123 456 789 

veya

string = '123 #{456} 789' 
eval('"' + string + '"') 
# => 123 456 789 
+1

"Makro değişimler" ile ne demek istiyorsun? – sawa

+0

@sawa, "# {}" bölümleri demek, lütfen, doğru şekilde düzenleyin, sadece İngilizce'de nasıl söyleyeceğimi bilmiyorum. –

+1

Tamam, belki de enterpolasyon demek istediniz. – sawa

cevap

19

Neler oluyor, eval, dizeyi kaynak kodu olarak değerlendiriyor. Eğer çift tırnak kullandığınızda, dize hiçbir interpolasyon dolayısıyla # onprogramına vardır, sen tek tırnak Ancak zaman

eval '"123 #{456.to_s} 789"' 
# => "123 456 789" 

enterpote ve

123 #{456.to_s} 789 
# => 123 

dize enterpolasyon olur olsun edilir eval numaralı çağrıdan önce, yöntemin parametresidir.

Ayrıca 456.to_s'un gereksiz olduğunu da unutmayın, sadece #{456} yapabilirsiniz.

+1

Tek tırnakların çift tırnak işareti ile değiştirilmesi, sözdizimi hatası verir çünkü "eval (" 123 # {456.to_s} 789 ")', dize # {} ve tırnak işareti şöyle yazılırsa "123 456 789" – Stefan

+0

olarak değerlendirilir: string = '12 # {45} 78 "9" 0 ' –

3

Sen gördük:

eval('"123 #{456.to_s} 789"') 

. . . umarım nedenini görebilirsin?

Değerlendiriciden alınan ifade, tam olarak yazmış olsaydınız (irb ya da .rb dosyasının bir parçası olarak), bir değerlendirmenin bir dize değeri vermesini istiyorsanız, değerlendirdiğiniz dizenin İçindeki ifadeyi String olarak belirten alıntıları içerir.