1

問題

ソース ファイルには、補間を含む多数の string.ome があり、特殊なシンボルを含むものもあれば、どちらも含まないものもあります。

エスケープされた一重引用符文字を変換しながら、一重引用符を二重引用符に置き換えることができるかどうかを調べようとしています。次に、この変換を 1 つまたは複数のソース コード ファイルに対して実行します。

例 - コード

次のコードを想像してください。

def myfunc(var, var2 = 'abc')
  s = 'something'
  puts 'a simple string'
  puts 'string with an escaped quote \' in it'
  x = "nasty #{interpolated}" + s + ' and single quote combo'
  puts "my #{var}"
end

例 - 結果

これを次のように変更したいと思います。

def myfunc(var, var2 = "abc")
  s = "something"
  puts "a simple string"
  puts "string with an escaped quote ' in it"
  x = "nasty #{interpolated}" + s + " and single quote combo"
  puts "my #{var}"
end

誰かが何かアイデアを持っていれば、私はとても感謝しています!

4

2 に答える 2

2

ピーター・ハミルトンが指摘したように、一重引用符の文字列を二重引用符で囲まれた等価物に置き換えることは、最初は簡単な作業のように思えるかもしれません。場所"、二重引用符で囲まれた文字列、%qリテラル文字列構造、ヒアドキュメント、コメント内など...

x = 'puts "foo"'
y = %/puts 'foo'/ # TODO: Replace "x = %/puts 'foo'/" with "x = %#puts 'bar'#"

しかし、この場合の正しい解決策は、その逆 (二重引用符から一重引用符) よりもはるかに簡単で、実際には部分的に達成可能です。

require 'ripper'
require 'sorcerer' # gem install sorcerer if necessary
my_source = <<-source
  x = 'puts "foo"'
  y = "puts 'bar'"
source
sexp = Ripper::SexpBuilder.new( my_source ).parse
double_quoted_source = Sorcerer.source sexp
#=> "x = \"puts \"foo\"\"; y = \"puts 'bar'\""

私が「部分的に達成可能」と言う理由は、あなたが見ることができるように、

puts double_quoted_source
#=> x = "puts "foo""; y = "puts 'bar'"

Sorcerer は、以前は一重引用符で囲まれていた文字列内の二重引用符をエスケープするのを忘れています。この問題を修正するパッチを魔術師の作者である Jim Weirich に気軽に提出してください。

于 2013-05-16T12:08:16.727 に答える