我最近发现自己需要根据用户输入生成一个简单的 Ruby 脚本,其中一些需要作为字符串文字包含在脚本中。虽然在我的特定情况下,此输入来自受信任的来源,但我仍然希望以一种不会中断的方式执行此操作,即使输入字符串恰好包含例如引号、反斜杠、换行符、井号或其他意外的元字符。
明显的解决方案(如 this earlier question 的已接受答案中所建议)是使用
String#inspect
方法,其文档说它:
返回 str 的可打印版本,被引号包围,特殊字符被转义。
但是,该文档没有明确说明将
String#inspect
的输出作为 Ruby 代码进行评估将返回原始字符串。而且,事实上,我确实在技术上设法想出了一个使用非 Unicode 字符串的反例:
pry(main)> str = 0x80.chr; eval(str.inspect) == str
=> false
然而,我需要编码的所有字符串都是 Unicode 字符串,所以这个反例对我来说只是理论上的兴趣。但我仍然想要一些书面保证,因此有以下问题:
eval(str.inspect)
是否保证等于str
,如果str
是Unicode字符串?另外,一个奖励问题:
eval("'" + str.gsub(/[\\']/, { "\\" => "\\\\", "'" => "\\'" }) + "'")
总是保证等于str
吗?