2013-05-06 53 views
0

我希望有如下的哈希my_statement逃逸的變量(包含數組)

my_statement = %|{:foo=>\#{bar_array}}| 

其中:foo是鍵和值是與bar_array以後的值來取代。之後,我以後再定義bar_array = ["a","b"],我做了一個eval這句話,並希望它顯示如下:

eval(my_statement) 
# => {:foo=>["a", "b"]} 

我需要逃跑的變量bar_array使其評估不是當my_statement分配,而是當eval是呼籲它。我似乎無法獲得變量的轉義。我試過\#,#,\\#

爲什麼我這樣做的背景: 我有幾個靜態定義的圖表支持SOLR查詢。我採取了在數據庫中的可序列化列中定義這些查詢的方法(他們再次「從不」更改)。實際上有兩個級別的查詢;第一級爲該查詢獲取「全部」數據;以及基於用戶從第一查詢中選擇一些數據(離開圖表)的第二級別 - 即,我需要一個變量作爲第二查詢的一部分。有時(如本例中)變量將包含一個數組。

+1

什麼是最終的目的是什麼?除非你可以顯示明確要求'eval'的理由,否則這是不可能的推薦方法。 – 2013-05-06 16:47:20

+0

好點 - 更新我原來的問題。 – 2013-05-06 17:27:15

回答

2

也許嘗試字符串格式。它不是在創作時評估,而是在後期評估。

statement = %|{:foo => %s}| 
array = ["a", "b"] 
eval(statement % array.inspect) #=> {:foo => ["a", "b"]} 
array = [1,2,3] 
eval(statement % array.inspect) #=> {:foo => [1, 2, 3]} 

這裏的another SO question與上述概念處理

我得到高度緊張,當我看到eval,所以我會建議尋找實現這一點的其他方式!但是,如果您認爲沒有其他方式,這應該起作用。

+0

我也喜歡這個,可能會使用,除非我可以擺脫使用eval。 – 2013-05-06 17:37:19

+0

我同意eval不是最好的,但1)似乎無法爲我的特殊情況找到更好的解決方案; 2)我現在正在演示版本 - 稍後會重新訪問。 – 2013-05-06 18:32:06

2

有更直接的方法來做到這一點。

(1)使它成爲一個方法

def statement; {foo: @array} end 
... 
# later in the code 
@array = %w[a b] 
statement # => {:foo => ["a", "b"]} 

(2)使用PROC

statement = ->{{foo: @array}} 
... 
# later in the code 
@array = %w[a b] 
statement.call # => {:foo => ["a", "b"]} 
+1

比'eval'好多了! =) – 2013-05-06 17:29:00

+1

我喜歡這個,但(再次抱歉,我最初沒有添加一些背景)我不認爲我可以設置實例var作爲我的序列化查詢的一部分。我相信它會在最初的時候尋找負載的價值。 – 2013-05-06 17:36:52