我正在尝试将哈希与ruby中字符串的键/值合并。
即
h = {:day => 4, :month => 8, :year => 2010}
s = "/my/crazy/url/:day/:month/:year"
puts s.interpolate(h)
我发现的只是迭代键并替换值。但我不确定是否有更好的方法呢? :)
class String
def interpolate(e)
self if e.each{|k, v| self.gsub!(":#{k}", "#{v}")}
end
end
由于
答案 0 :(得分:7)
无需重新发明Ruby内置插件:
h = {:day => 4, :month => 8, :year => 2010}
s = "/my/crazy/url/%{day}/%{month}/%{year}"
puts s % h
(注意这需要Ruby 1.9 +)
答案 1 :(得分:5)
“更好”可能是主观的,但这是一种只使用一次gsub
调用的方法:
class String
def interpolate!(h)
self.gsub!(/:(\w+)/) { h[$1.to_sym] }
end
end
因此:
>> "/my/crazy/url/:day/:month/:year".interpolate!(h)
=> "/my/crazy/url/4/8/2010"
答案 2 :(得分:1)
这对我来说并不坏看,但另一种方法是使用ERB:
require 'erb'
h = {:day => 4, :month => 8, :year => 2010}
template = ERB.new "/my/crazy/url/<%=h[:day]%>/<%=h[:month]%>/<%=h[:year]%>"
puts template.result(binding)
答案 3 :(得分:1)
其他想法可能是扩展String#%
方法,以便它知道如何处理Hash
参数,同时保留现有功能:
class String
alias_method :orig_percent, :%
def %(e)
if e.is_a?(Hash)
# based on Michael's answer
self.gsub(/:(\w+)/) {e[$1.to_sym]}
else
self.orig_percent e
end
end
end
s = "/my/%s/%d/:day/:month/:year"
puts s % {:day => 4, :month => 8, :year => 2010}
#=> /my/%s/%d/4/8/2010
puts s % ['test', 5]
#=> /my/test/5/:day/:month/:year