2

ruby で任意のテキストに対して文字列補間を実行する単純な関数を作成しようとしています。また、「\#{foo}」が評価されるのではなく「#{foo}」に変換されるように、関数がエスケープされた補間ブロックを評価しないようにします。

エスケープされたブロックで式を渡すと、メソッドを使用すると値が正しく表示されますが、使用するputsとエスケープ文字が含まれますp。理由がわかりません。

これが私のコードです:

def evil_mark text
  part = text.partition(/[^\\]\#{.*?}/)
  return_string = part[0]
  until part[1] == ""
     return_string << eval("\"" + part[1] + "\"")
     part = evil_mark(part[2]).partition(/[^\\]\#{.*?}/)
     return_string << part[0]
  end
  return_string.gsub!(/\\\#{.*?}/){|s| s[1..-1]}
  return return_string
end

$foo = 'faz'
$bar = 'baz'

s = 'This is some \#{$foo} bar and some #{$bar} bat'

puts evil_mark s
#~> This is some #{$foo} bar and some baz bat

p evil_mark s
#~> "This is some \#{$foo} bar and some baz bat"

ところで、この方法を使用するのが危険な場合があることは理解していますeval

4

2 に答える 2

2

返品に問題はありません。#p を使用したときにまだエスケープされているように見える唯一の理由は、 p が文字列を出力するため、その文字列のルビコードとして本質的に直接使用できるからです。- つまり、#p は意図的にエスケープを追加します。

于 2013-05-01T20:42:44.597 に答える