I watching the demo/use cases video for contracts.ruby and recorded some thoughts.
The use case states that you can avoid bugs like needing string keys instead of symbol keys be enforcing a contract that requires the method input to be a string.
IMO you should instead create a flexible interface that will allow any "stringable" input to be given to the method. That is, use the implicit string conversion methods to_s
to make a string of it for indexing into the hash.