转义变量(包含数组)

时间:2013-05-06 16:40:43

标签: ruby arrays escaping

我想要一个哈希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查询支持的静态定义图表。我采用这种方法在数据库中的可序列化列中定义这些查询(同样它们“永远不会”改变)。实际上有两个级别的查询;获得该查询的“所有”数据的第一级;第二级是基于用户从第一个查询中选择一些数据(从图表中删除) - 即,我需要一个变量作为第二个查询的一部分。有时(如本例所示)变量将包含一个数组。

2 个答案:

答案 0 :(得分: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时,我会非常紧张,因此我建议您寻找其他方法来实现这一目标!但是,如果您认为没有其他方法,这应该有效。

答案 1 :(得分: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"]}