首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Ruby中进行"late“字符串插值

如何在Ruby中进行"late“字符串插值
EN

Stack Overflow用户
提问于 2011-09-13 02:51:36
回答 4查看 5.8K关注 0票数 26
代码语言:javascript
复制
>> string = '#{var}'
=> "\#{var}"

>> proc = Proc.new { |var| string }
=> #<Proc:0xb717a8c4@(pry):6>

>> proc.call(123)
=> "\#{var}"

这不是我真正想要的。string前后的双引号会产生明显的undefined local variable

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-13 02:59:34

虽然这是可能的,但如果不使用eval,它在这里不会像您想的那样工作,如果有替代方案,通常这是一个坏主意。好消息是你有几个选择。

最简单的方法是使用sprintf格式化,使用String#%方法可以使格式化变得更加简单:

代码语言:javascript
复制
string = '%s'

proc = Proc.new { |var| string % var }

proc.call(123)
# => "123"

这是一个非常可靠的方法,因为任何支持.to_s方法的方法都可以工作,并且如果它包含可执行代码,就不会导致整个世界崩溃。

票数 21
EN

Stack Overflow用户

发布于 2013-08-20 20:37:52

在我的例子中,我需要将配置存储在一个带有插值的yml中,但只有在需要时才会对其进行插值。对我来说,Proc的公认答案似乎过于复杂了。

在ruby 1.8.7中,您可以使用%语法,如下所示:

代码语言:javascript
复制
"This is a %s verb, %s" % ["nice", "woaaaah"]

当至少使用ruby 1.9.x (或使用i18n的ruby 1.8.7 )时,有一个更干净的替代方案:

代码语言:javascript
复制
my_template = "This is a %{adjective} verb, %{super}!"

my_template % { adjective: "nice", super: "woah" }
=> "This is a nice verb, woah!"
票数 28
EN

Stack Overflow用户

发布于 2013-04-03 02:18:21

您可以通过创建一个"curried“函数(即:返回一个Proc的Proc)来实现您正在寻找的DRY,其中内部函数包含基本字符串以及每个不同部分的变量。

如果我错了,请纠正我,但在注释链接后面的代码中,两个字符串之间的唯一区别是末尾有一个字符。(即使不是这样,您也可以使用此技术来实现相同的目标。)您可以创建一个返回包含字符串的Proc的Proc,然后为两个尾随字符调用两次外部Proc:

代码语言:javascript
复制
rails_root = "whatever" # Not variant for the string
rails_env_prompt = "whatever" #not variant for the string

spec = Proc.new { |tail_char| 
  Proc.new {|obj, nest_level, *| 
    "#{rails_root} #{rails_env_prompt} #{obj}:#{nest_level}#{tail_char} "
  }
}

Pry.config.prompt = [ spec.call(">"), spec.call("*") ]  

Pry.config.prompt[0].call("My obj", "My Nest Level")
# result: "whatever whatever My obj:My Nest Level> "
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7392496

复制
相关文章

相似问题

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