こんにちはの村上です。
TECHSCORE Advent Calendar 2015 の22日目の記事です。
今月にいよいよRuby2.3がリリースされます。たぶん。。。おそらく。。。
そして、先日(12/11)にRuby 2.3.0-preview2 がリリースされました。
なんで、Ruby 2.3.0-preview2をインストールしてさっそく触ってみましょう。
インストール
まずはインストールですが、rvmを使用しているんでそれでのインストール方法を紹介します。
rvmを最新にして一覧を見てみると
1 2 |
rvm get head rvm list knwon |
1 2 3 4 5 6 7 8 9 10 11 |
[ruby-]1.8.6[-p420] [ruby-]1.8.7[-head] # security released on head [ruby-]1.9.1[-p431] [ruby-]1.9.2[-p330] [ruby-]1.9.3[-p551] [ruby-]2.0.0[-p643] [ruby-]2.1.4 [ruby-]2.1[.5] [ruby-]2.2[.1] [ruby-]2.2-head ruby-head |
まだここには出てないようです。
直接サーバー(http://ftp.ruby-lang.org/pub/ruby/2.3/)を見てみると存在するので、
インストールはできそうです。
1 |
rvm install ruby-2.3.0-preview2 |
すると
1 2 3 4 5 6 7 8 9 10 11 12 13 |
rvm list rvm rubies ruby-1.9.3-p545 [ x86_64 ] ruby-2.0.0-p598 [ x86_64 ] ruby-2.1.1 [ x86_64 ] ruby-2.1.2 [ x86_64 ] ruby-2.1.3 [ x86_64 ] ruby-2.1.5 [ x86_64 ] ruby-2.2.0 [ x86_64 ] * ruby-2.2.1 [ x86_64 ] => ruby-2.3.0-preview2 [ x86_64 ] |
おおインストールできましたね。
では早速さわってみましょう。
positive? negative?
Ruby2.3で追加されるメソッドで簡単なものがこれ
数字が正か負かを判断してくれるメソッドです。
1 2 3 4 |
-1.positive? => false -1.negative? => true |
こういう数値の判断で符号の向きを逆にしてしまうことがあるので、少し便利かも。
ぼっちオペレータ
safe navigation operator &. (またの名をぼっちオペレータ) が導入されました。
簡単に言うとnilでもエラーでませんよ。ってやつです。
1 2 3 4 5 6 7 8 9 10 |
a = "hoge" a.upcase => "HOGE" a = nil a.upcase NoMethodError: undefined method `upcase' for nil:NilClass a&.upcase => nil |
ってな具合です。
でも
1 2 3 4 5 6 7 8 9 10 11 12 13 |
a = "hoge" a.upcase => "HOGE" a.upcaseaaa NoMethodError: undefined method `upcaseaaa' for "hoge":String Did you mean? upcase upcase! a&.upcaseaaa NoMethodError: undefined method `upcaseaaa' for "hoge":String Did you mean? upcase upcase! |
とぼっちオペレータを付けてもnil以外のオブジェクトでメソッドがない場合はNoMethodErrorのようですね。
ActiveSupportのtryではなくtry!に近いのかな?
ちなみに
1 2 |
Did you mean? upcase upcase! |
と出てるのはRuby2.3からdid_you_mean gem がバンドルされたからです。
NoMethodErrorの時に他の候補を表示してくれます。
それにしてもぼっちオペレータwww
ふかーーーい階層にいる値を取得する
深い階層にあるハッシュの値、配列の値を一気に取得できるHash#dig、Array#digが追加されます。
ハッシュの方を例で
1 2 3 4 5 6 |
params = {hoge: {foo: "フー", var: {piyo: "ぴよ"}}} => {:hoge=>{:foo=>"フー", :var=>{:piyo=>"ぴよ"}}} params[:hoge][:var][:piyo] => "ぴよ" params.dig(:hoge, :var, :piyo) => "ぴよ" |
ちょっと書き方が簡単になっただけ?と思いきや
1 2 3 4 5 6 7 |
params[:hoge][:foo][:piyo] TypeError: no implicit conversion of Symbol into Integer from (irb):4:in `[]' from (irb):4 from /home/dave/.rvm/rubies/ruby-2.3.0-preview2/bin/irb:11:in `<main>' params.dig(:hoge, :foo, :piyo) => nil |
nilになった場合にも落ちない!!
いちいちnilチェックしなくていいので便利です。
Ruby2.3 + Rails4.2
他にも追加されている機能やメソッドがありますが、ここではこの辺にしてRuby2.3でRails4.2のプロジェクトを動かしてみましょう。
ここではRuby2.2で作られたRailsプロジェクトをRuby2.3にして再構築、つまりRuby2.2 ⇒ Ruby2.3の移行ということでやります。
対象プロジェクトのディレクトリで
1 |
bundle install --path vendor/bundle --local |
を実行します。
vendor以下が「bundle/ruby/2.3.0」となってます。
1 2 3 4 5 6 7 8 9 |
ls -1 vendor/bundle/ruby/2.3.0/ bin/ build_info/ cache/ doc/ extensions/ gems/ specifications/ |
次にアプリサーバー(unicorn)を動作させて動きをみてみると特に問題なく動作してました。
ちなみにこのプロジェクトで使っているGemは
- 画像アップロード paperclip
- 検索機能 ransack
- ページング kaminari
などがあり、問題なく動いていました。
互換性は問題ないように思います。
12月25日にリリース予定になっているので、次の開発からはRuby2.3が使えそうです。
参考:https://www.ruby-lang.org/ja/news/2015/12/11/ruby-2-3-0-preview2-released/