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

4

2 回答 2

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]}

这是另一个处理上述概念的SO问题

当我看到时我会非常紧张,eval所以我建议找到其他方法来完成这个!但是,如果您认为没有其他方法,这应该可以工作。

于 2013-05-06T16:49:02.087 回答
2

有更直接的方法可以做到这一点。

(1) 使其成为一种方法

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

(2) 使用过程

statement = ->{{foo: @array}}
...
# later in the code
@array = %w[a b]
statement.call # => {:foo => ["a", "b"]}
于 2013-05-06T17:07:09.567 回答