首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby -求字符串中的转义内插段

Ruby -求字符串中的转义内插段
EN

Stack Overflow用户
提问于 2021-02-03 10:25:22
回答 2查看 131关注 0票数 1

我觉得这应该是显而易见的,但我有点精神障碍。使用Ruby,假设我有一个字符串,它可能包含或不包含一些转义字符串--插值段,如下所示:

代码语言:javascript
复制
s1 = "Hello world"
=> "Hello world"
s2 = "Hello \#{foo}, hello \#{bar}"
=> "Hello \#{foo}, hello \#{bar}"
#note that the string-interpolation (#{}) segments above are escaped, so they're not interpolated 
#- that is, it doesn't try to look up what foo and bar are, it's just a dumb string.

我想有效地“呈现”这些字符串,比如:

代码语言:javascript
复制
foo = "chunky"
=> "chunky"
bar = "bacon"
=> "bacon"
myfunc(s1)
=> "Hello world"
myfunc(s2)
=> "Hello chunky, hello bacon"

这看起来应该是最基本的,但我就是看不见.

编辑--我已经找到了一种方法,也就是转义原始字符串中的引号,然后它就可以让人觉得有点笨重了。

代码语言:javascript
复制
>> s1 = "\"Hello world\""
=> "\"Hello world\""
>> s2 = "\"Hello \#{foo}, hello \#{bar}\""
=> "\"Hello \#{foo}, hello \#{bar}\""
>> foo = "chunky"
=> "chunky"
>> bar = "bacon"
=> "bacon"
>> eval s1
=> "Hello world"
>> eval s2
=> "Hello chunky, hello bacon"

它还需要普通字符串将它们的引号转义,这并不理想。

EN

回答 2

Stack Overflow用户

发布于 2021-02-03 11:35:25

你“做错了”。这方面有一个标准实践:使用sprintf而不是eval

而不是像这样定义字符串:

代码语言:javascript
复制
s2 = 'Hello #{foo}, hello #{bar}'

(注意:使用单引号而不是双引号是定义未计算字符串的更容易/更简单的方法。)

相反,将其定义如下:

代码语言:javascript
复制
s2 = 'Hello %{foo}, hello %{bar}'

然后使用sprintf插值参数。

代码语言:javascript
复制
sprintf(s2, { foo: "Chunky", bar: "Bacon"})

或相当于:

代码语言:javascript
复制
s2 % { foo: "Chunky", bar: "Bacon"}
票数 2
EN

Stack Overflow用户

发布于 2021-02-03 10:59:28

如果你接受简单的答案:

代码语言:javascript
复制
eval "\"#{s2}\""

它将s2字符串以双引号括起来,然后通过eval对字符串进行计算,然后我们可以将其程序化,使进一步的编码看起来更漂亮,更易于调试:

将对象定义为def,它有一个只计算全局变量的回退,因为您只将字符串传递到过程中:

代码语言:javascript
复制
# this one depends on global variables ...
def myfunc(x)
  eval "\"#{x}\""
end

myfunc(s2)

将对象定义为lambda (红宝石黑人和蓝宝石),这具有运行“就位”的优点,因此应该计算局部变量:

代码语言:javascript
复制
# should use local variables
expand= ->(x) { eval "\"#{x}\"" }

expand.(s2)
# or
expand[s2]
# or in long form:
expand.call(s2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66025587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档