2013-05-06 30 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