2013-06-18 59 views
9

我不明白,爲什麼eval是這樣的:紅寶石:EVAL用繩子插

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

我怎麼能成插裏面eval一個字符串?

更新:

謝謝朋友們。有效。

所以,如果你有一個字符串變量與稍後要EVAL #{},你應該這樣做如下解釋:

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

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

你是什麼意思的「宏觀替代」? – sawa

+0

@sawa,我的意思是'#{}'部分,請用正確的方式編輯它,我只是不知道如何用英文說出 –

+1

好吧,也許你的意思是插值。 – sawa

回答

19

發生了什麼,eval正在評估字符串作爲源代碼。當您使用雙引號,字符串插值

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

然而,當您使用單引號,沒有插,因此#註釋的開始,你會得到

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

串插發生在調用eval之前,因爲它是該方法的參數。

另請注意,456.to_s是不必要的,你可以做#{456}

+1

用雙引號替換單引號給出了一個語法錯誤,因爲eval(「123#{456.to_s} 789」)被評估爲123 456 789' – Stefan

+0

如果字符串有#{}和引號,如下所示: string = '12#{45} 78「9」0「 –

3

你想:

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

。 。 。希望你能看到爲什麼?

傳遞到從EVAL的interpretter的代碼是完全一樣的,如果你寫了它(到irb,或作爲.rb文件的一部分),所以如果你想要一個eval輸出一個字符串值,該字符串您評估絕包括使其中的表達式成爲String的引號。