在Ruby中我可以建立一個變量,像這樣Ruby on Rails的:與變量解析字符串
irb(main):004:0> a = "#{Date.today}" => "2012-03-23"
但具體日期我怎麼能做到這一點與已經創建的字符串:
irb(main):005:0> a = '#{Date.today}' => "\#{Date.today}"
的背景是,我在一個數據庫中存儲了一個具有不同變量的路徑,我需要在運行時替換這些變量。
感謝您的任何幫助。
在Ruby中我可以建立一個變量,像這樣Ruby on Rails的:與變量解析字符串
irb(main):004:0> a = "#{Date.today}" => "2012-03-23"
但具體日期我怎麼能做到這一點與已經創建的字符串:
irb(main):005:0> a = '#{Date.today}' => "\#{Date.today}"
的背景是,我在一個數據庫中存儲了一個具有不同變量的路徑,我需要在運行時替換這些變量。
感謝您的任何幫助。
你可以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感到滿意。
我建議使用掃描而不是GSUB的尋找多個匹配 – 2012-03-23 10:00:42
一個= '#{Date.today}' 結果= EVAL(一) 這只是那些返回零。 但我會用你的建議,構建一個簡單的DSL。謝謝。 – user1287808 2012-03-23 10:19:47
@padde:'scan'不幫助這裏,因爲它不允許改變源字符串,在這種情況下是剛剛找到比賽同樣重要的匹配部分。 – 2012-03-23 10:26:47
如果你真的想運行任意Ruby代碼,你可以使用eval這樣的:
a = '#{Date.today}'
eval("\"#{a}\"")
如果你無法避免它,我想你可以使用eval – 2012-03-23 08:55:18