0

my_statement私は以下のようにハッシュしたい:

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

where:fooはキーで、値はbar_array後の値に置き換えられます。後で を定義bar_array = ["a","b"]した後、このステートメントを実行しeval、次のように表示します。

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

が割り当てられたときではなく、呼び出されたbar_arrayときに評価されるように、変数をエスケープする必要があります。変数のエスケープを取得できないようです。私は試しました、、。my_statementeval\##\\#

私がこれを行う理由の背景: SOLR クエリに基づく静的に定義されたグラフがいくつかあります。私は、これらのクエリをデータベースのシリアル化可能な列に定義するというアプローチを取りました (これも「決して」変更されません)。実際には、クエリには 2 つのレベルがあります。そのクエリの「すべて」のデータを取得する最初のレベル。2 番目のレベルは、ユーザーが最初のクエリから (グラフから) データを選択することに基づいています。つまり、2 番目のクエリの一部となる変数が必要です。場合によっては (この例のように) 変数に配列が含まれることがあります。

4

2 に答える 2

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 に答える
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 に答える