2012-03-23 30 views
1

在Ruby中我可以建立一個變量,像這樣Ruby on Rails的:與變量解析字符串

irb(main):004:0> a = "#{Date.today}" => "2012-03-23" 

但具體日期我怎麼能做到這一點與已經創建的字符串:

irb(main):005:0> a = '#{Date.today}' => "\#{Date.today}" 

的背景是,我在一個數據庫中存儲了一個具有不同變量的路徑,我需要在運行時替換這些變量。

感謝您的任何幫助。

+0

如果你無法避免它,我想你可以使用eval – 2012-03-23 08:55:18

回答

2

你可以eval

a = 'Date.today' 
result = eval(a) 

字符串雖然這個作品,它的可能是極其危險的,如果你沒有完全控制該字符串的內容(這是真的硬,如果處理任何類型的的用戶輸入)。

所以一般建議您從不使用eval。相反,您可以創建一些簡單的DSL(域特定語言),在您的字符串中有令牌,然後用預先計算的值替換。一個簡單的例子可能是:

a = "Today is :today" 
result = a.gsub(/:(\w+)/) do |match| 
    case $1 
    when "today" 
    Date.today.to_s 
    end 
end 

由於您不評估任意Ruby代碼,這是更安全的。或者,根據您的實際使用情況,您可能也會對String formatting感到滿意。

+0

我建議使用掃描而不是GSUB的尋找多個匹配 – 2012-03-23 10:00:42

+0

一個= '#{Date.today}' 結果= EVAL(一) 這只是那些返回零。 但我會用你的建議,構建一個簡單的DSL。謝謝。 – user1287808 2012-03-23 10:19:47

+0

@padde:'scan'不幫助這裏,因爲它不允許改變源字符串,在這種情況下是剛剛找到比賽同樣重要的匹配部分。 – 2012-03-23 10:26:47

2

如果你真的想運行任意Ruby代碼,你可以使用eval這樣的:

a = '#{Date.today}' 
eval("\"#{a}\"")