Skip to content

Instantly share code, notes, and snippets.

@ccooke
Created July 6, 2010 11:50
Show Gist options
  • Save ccooke/465283 to your computer and use it in GitHub Desktop.
Save ccooke/465283 to your computer and use it in GitHub Desktop.
class String
KEYWORD_REGEX = /(?:|[^%])(%\((\w+)\))/
def keyreplace! &block
while match = self.match( KEYWORD_REGEX )
offsets = match.offset( 1 )
replacement = block.call( match[2].to_sym ) || ""
self[ offsets[0] ... offsets[1] ] = replacement
end
self
end
def keyreplace &block
self.clone.keyreplace! &block
end
def & arg
keyreplace do |k|
arg[ k ] or raise ArgumentError.new( "No key in replacement hash: '#{ k.to_s }'" )
end
end
end
i = "foo %(name) bar %(fog)"
i.keyreplace { |k| { :name => "hello" }[ k ] }
i & { :name => "world", :fog => "mist" }
"foo %s" % [ "foo" ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment