雑草SEの備忘録

東大を卒業し、SEとして働くことになった。備忘録的に作業を綴る。

ruby 1.9系のラムダ記法

今時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系を使うことなんてないかもしれませんが、行けると思って知らないとはまるのでご紹介でした。