我试图遍历结构的元素,查找包含格式的字符串{...}
,并用散列中的相应字符串替换它们.这是我正在使用的数据:
Request = Struct.new(:method, :url, :user, :password) request = Request.new request.user = "{user} {name}" request.password = "{password}" parameters = {"user" => "first", "name" => "last", "password" => "secret"}
这是尝试1:
request.each do |value| value.gsub!(/{(.+?)}/, parameters["\1"]) end
在这种尝试中,parameters["\1"] == nil
.
尝试2:
request.each do |value| value.scan(/{(.+?)}/) do |match| value.gsub!(/{(.+?)}/, parameters[match[0]]) end end
这导致了request.user == "first first"
.尝试parameters[match]
结果nil
.
谁能协助解决这个问题?
你的任何尝试都不会起作用,因为gsub!
在调用之前会对参数进行评估gsub!
.parameters[...]
将在更换前进行评估,因此无法反映匹配.另外,"\1"
即使该字符串是直接参数,也不会被第一次捕获所取代gsub!
.你需要逃避转义字符,如"\\1
".为了使它工作,你需要给一个块gsub!
.
但是,不要这样做,尝试使用已经存在的东西.您应该使用字符串格式%{}
并使用符号作为哈希.
request.user = "%{user} %{name}" request.password = "%{password}" parameters = {user: "first", name: "last", password: "secret"} request.each do |value| value.replace(value % parameters) end