用字符串替换变量

Raj*_*lan 1 ruby

我有这样的字符串

p="23232"
str="policy var=p saved" #It could be p or a or b, any variable.
Run Code Online (Sandbox Code Playgroud)

我想用var = p代替p的值,但是我找到了用var = p代替p的方法。

p="23232"
str="policy var=p saved"

p str.gsub(/var=(.)/,"\\1")
Run Code Online (Sandbox Code Playgroud)

这段代码将var = p替换为p,但我想用var = p代替p的值,例如

输出

policy 23232 saved
Run Code Online (Sandbox Code Playgroud)

我知道可以通过给gsub块来实现,但是我不知道如何。

Ama*_*dan 5

如果确实需要,可以使用Binding#local_variable_get以下名称按名称访问局部变量:

p="23232"
str="policy var=p saved"

str.gsub(/var=(\w+)/) { binding.local_variable_get($1) }
Run Code Online (Sandbox Code Playgroud)

但是,我强烈建议您使用散列代替局部变量:

vars = { "p" => "23232" }
str="policy var=p saved"

str.gsub(/var=(\w+)/) { vars[$1] }
Run Code Online (Sandbox Code Playgroud)

编辑:局部变量与实例变量非常不同。有多种方法。

直接获取实例变量是最糟糕的选择,因为您可能会跳过将在访问器中实现的逻辑。请注意,实例变量的名称以开头@

更好的方法是调用访问器,但这又需要send

class Foo
  attr_accessor :bar
  def initialize(bar)
    @bar = bar
  end
end

foo = Foo.new("baz")
str = "policy var=bar saved"

# by direct access
str.gsub(/var=(\w+)/) { foo.instance_variable_get("@" + $1) }
# by invoking the accessor
str.gsub(/var=(\w+)/) { foo.send($1) }
Run Code Online (Sandbox Code Playgroud)

最好的方法还是通过键而不是多个实例变量来使用哈希和索引值。我出于教育目的回答,但请以实际代码代替:

class Foo
  def initialize()
    @vars = { "bar" => "baz" }
  end

  def replace_by_hash(str)
    str.gsub(/var=(\w+)/) { @vars[$1] }
  end
end

foo = Foo.new
str = "policy var=bar saved"

foo.replace_by_hash(str)
Run Code Online (Sandbox Code Playgroud)