diff --git a/src/bindings/ruby/lib/hammer.rb b/src/bindings/ruby/lib/hammer.rb
index 0f10ab182f82755f0488382d8e480967c336fff6..4b86690cfd6ddc7db8c132bf815cd83667109a1c 100644
--- a/src/bindings/ruby/lib/hammer.rb
+++ b/src/bindings/ruby/lib/hammer.rb
@@ -52,3 +52,9 @@ p parser.parse 'Hello Mom!'
 h = Hammer::Parser
 parser = h.sequence(h.token('Hello '), h.choice(h.token('Mom'), h.token('Dad')), h.token('!'))
 p parser.parse 'Hello Mom!'
+
+s = 'blah'
+parser = h.token(s)
+p parser.parse 'BLAH' # => false
+s.upcase!
+p parser.parse 'BLAH' # => false
diff --git a/src/bindings/ruby/lib/hammer/parser.rb b/src/bindings/ruby/lib/hammer/parser.rb
index 79e03705528d0d20a4fb35df4281f6dbb6220b81..defb776beaaee02251cf22df298cf322716803d7 100644
--- a/src/bindings/ruby/lib/hammer/parser.rb
+++ b/src/bindings/ruby/lib/hammer/parser.rb
@@ -17,11 +17,14 @@ module Hammer
     end
 
     def self.token(string)
-        h_parser = Hammer::Internal.h_token(string, string.length)
+      h_string = string.dup
+      h_parser = Hammer::Internal.h_token(h_string, h_string.length)
 
-        parser = Hammer::Parser.new
-        parser.instance_variable_set :@h_parser, h_parser
-        return parser
+      parser = Hammer::Parser.new
+      parser.instance_variable_set :@h_parser, h_parser
+      # prevent string from getting garbage-collected
+      parser.instance_variable_set :@h_string, h_string
+      return parser
     end
 
     def self.ch(char)