今時rubyの1.9系を使っている人なんていないと思いますが、私は仕事の都合上、1.9系を使うときがあります。
しかも、同じリポジトリでサーバーによってrubyのバージョンが2.1系だったり、1.9系だったりするので厄介です。
今回、仕事でrubyのラムダ記法で2系ならOKなのに1.9系だったらだめだった書き方があったので、備忘録的に紹介します。
まずは、アロー関数ではなくlambdaと書いた場合は問題ありません。
$ ruby -v ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-darwin15.2.0] $ irb irb(main):001:0> function = lambda do |x| irb(main):002:1* puts x * 2 irb(main):003:1> end => #<Proc:0x007fabc195d9d0@(irb):1 (lambda)> irb(main):004:0> function.(3) 6 => nil
そして、アロー関数での書き方。
irb(main):005:0> irb(main):006:0* function = ->(x) { irb(main):007:1* puts x * 2 irb(main):008:1> } => #<Proc:0x007fabc1963560@(irb):6 (lambda)> irb(main):009:0> function.(3) 6 => nil
このように書くとうまくいきます。
しかし、
irb(main):010:0> function = -> (x) { irb(main):011:1* puts x * 2 irb(main):012:1> } SyntaxError: (irb):10: syntax error, unexpected tLPAREN_ARG, expecting keyword_do_LAMBDA or tLAMBEG function = -> (x) { ^ (irb):10: syntax error, unexpected tLAMBEG, expecting $end from /Users/username/.rbenv/versions/1.9.3-p551/bin/irb:12:in `<main>'
このように書くとSyntaxErrorになります。何が違うのかというと、ラムダの矢印のあとの引数のカッコが矢印にくっついているかいないか。1.9系だと、くっついていないとSyntaxErrorになります。
2系以上だと、離れていてもSyntaxErrorにはなりません。
$ ruby -v ruby 2.0.0p648 (2015-12-16 revision 53162) [x86_64-darwin15.2.0] $ irb irb(main):001:0> function = -> (x) { irb(main):002:1* puts x * 2 irb(main):003:1> } => #<Proc:0x007faf791cb288@(irb):1 (lambda)> irb(main):005:0> function.(3) 6 => nil
今は1.9系を使うことなんてないかもしれませんが、行けると思って知らないとはまるのでご紹介でした。