2015-11-19 67 views
4

我有一个字符串,其中包含一些插值语句,如description='Hello! I am #{self.name}'。该字符串按原样存储在数据库中;所以没有应用自动字符串插值。Ruby将字符串插值应用于单引号字符串

我想在稍后的日期应用此插值。我可以做一些像eval("\"+description+\"")这样疯狂的事情,但必须有更好,更红宝石般的方式才能做到这一点,对吧?

+0

https://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#The_.25_Notation – lifetimes

+0

在eval的情况下,您应该信任数据。在其他情况下,这是一个巨大的安全风险。 –

回答

6

使用%操作:

'database store string says: %{param}' % {param: 'noice'} 
#=> "database store string says: noice" 
+0

请注意,命名引用以'%'开始,而不是'#' – Stefan

1
class Person 
    attr_reader :name 

    def initialize(name) 
    @name = name 
    end 

    def description 
    'Hello! I am #{self.name}' 
    end 

    def interpolated_description 
    description.split('#').map { |v| v.match(/\{(.*)\}/) ? send($1.split('.').last) : v }.join 
    end 
end 

p = Person.new('Bot') 

p.interpolated_description 
=> "Hello! I am Bot" 

这个怎么样?