热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

用字符串替换变量

如何解决《用字符串替换变量》经验,为你挑选了1个好方法。

我有这样的字符串

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)


推荐阅读
author-avatar
寂寞已成伤兑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有