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