I’m writing a Ruby gem using the {key: 'value'} syntax for hashes throughout my code. My tests all pass in 1.9.x, but I (understandably) get syntax error, unexpected ':', expecting ')' in 1.8.7.
Is there a best practice for supporting the 1.8.x? Do I need to rewrite the code using our old friend =>, or is there a better strategy?
I think you’re out of luck, if you want to support 1.8 then you have to use
=>. As usual, I will mention that you must use=>in certain cases in 1.9::'this.that'.:$set => hashbut$set: hashis a syntax error.Back to our regularly scheduled programming.
Why do I say that you’re out of luck? The Hash literal syntaxes (both of them) are hard-wired in the parser and I don’t think you’re going to have much luck patching the parser from your gem. Ruby 1.8.7’s
parse.yhas this to say:and
tASSOCis=>so hash literals are hard-wired to use=>. 1.9.3’s says this:We have the fat-arrow syntax again (
arg_value tASSOC arg_value) and the JavaScript style (tLABEL arg_value); AFAIK,tLABELis also the source of the restrictions on what sorts of symbols (no:$set, no:'this.that', …) can be used with the JavaScript-style syntax. The current trunkparse.ymatches 1.9.3 for Hash literals.So the Hash literal syntax is hard-wired into the parser and you’re stuck with fat arrows if you want to support 1.8.