作者:寂寞已成伤兑 | 来源:互联网 | 2022-10-15 12:12
我有这样的字符串
p="23232"
str="policy var=p saved" #It could be p or a or b, any variable.
我想用var = p代替p的值,但是我找到了用var = p代替p的方法。
p="23232"
str="policy var=p saved"
p str.gsub(/var=(.)/,"\\1")
这段代码将var = p替换为p,但我想用var = p代替p的值,例如
输出
policy 23232 saved
我知道可以通过给gsub块来实现,但是我不知道如何。
1> Amadan..:
如果确实需要,可以使用Binding#local_variable_get
以下名称按名称访问局部变量:
p="23232"
str="policy var=p saved"
str.gsub(/var=(\w+)/) { binding.local_variable_get($1) }
但是,我强烈建议您使用散列代替局部变量:
vars = { "p" => "23232" }
str="policy var=p saved"
str.gsub(/var=(\w+)/) { vars[$1] }
编辑:局部变量与实例变量非常不同。有多种方法。
直接获取实例变量是最糟糕的选择,因为您可能会跳过将在访问器中实现的逻辑。请注意,实例变量的名称以开头@
。
更好的方法是调用访问器,但这又需要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) }
最好的方法还是通过键而不是多个实例变量来使用哈希和索引值。我出于教育目的回答,但请以实际代码代替:
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)