ここ一年くらいRubyやってなかったし、初心者以下のレベルの俺が「Ruby 2.3出たし、キメてみるか」って感じでキメてみた話
ちなみに、Ruby全然初心者なのでこれまでどうだったかとか全く知らずに書いてるので、マサカリ投げられても困っちゃうからよろしくヽ(´ー`)ノ
結論からいうと、Ruby 2.3をキメると気持ちいい
Ruby 2.3.0 Released
毎年予告通りにクリスマス(12/25)に Ruby 2.3.0がリリースされましたね。
毎年できるとか素晴らしい!
Ruby 2.3.0のインストール
Homebrewで既にruby-buildとrbenvはインストール済みだったので、とりあえずUpdateしてからRuby 2.3.0をインストールした。
ruby-buildとrbenvとインストールしてなかったら、upgradeのところをinstallに変えればいいと思う。
$ brew update $ brew upgrade ruby-build rbenv $ rbenv install 2.3.0 $ rbenv global 2.3.0 $ ruby -v ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
ちなみに、2.3.0の前はRuby 2.0とか使ってた。それくらいRubyやってないのね、俺。
適当にRuby 2.3.0の機能試してみる
以下のQiitaの記事を参考に面白いそうなやつだけ試してみた
Redmineへのリンクまでまとまってるこれがわりと良かったので一緒に読みながらやってみた。
NEWS for Ruby 2.3.0 (Ruby 2.3.0)
grep_v
合致しない要素を返す Enumerable#grep_v。
「引数obj === 要素」を実行して、その結果が真だった要素を集めて配列で返すgrep
っていうのがあるらしく、それの逆バージョンがgrep_v
。
あーこれ便利だね。うん便利だ。
ざっと以下のような感じ。
def grep_v friends = %w[John Alain Jim Delmer] j_friends = friends.grep(/^J/) # 先頭が J で始まる要素を集める others = friends.grep_v(/^J/) # 先頭が J で始まらない要素を集める puts j_friends # John,Jim puts others # Alain,Delmer end
def grep_v_by_type nums = [1,1.0,"1",nil] numeric_nums = nums.grep(Numeric) puts numeric_nums # 1, 1.0 ohters = nums.grep_v(Numeric) puts ohters # "1", nil end
Numeric#positive?, negative?
数値の正負を判断して true/false を返す Numeric#positive? と Numeric#negative? が追加されたみたい。
あーこれも便利だ。
ちなみに、0はpositiveでもnegativeでもないのね。
def numeric_positive_and_negative nums = (-3..3) puts nums.select(&:positive?) # 1, 2, 3 puts nums.select(&:negative?) # -1, -2, -3 puts 0.negative? # false puts 0.positive? # false end
ハッシュを比較して包含関係を判別する Hash#<=, <, >=, >
ハッシュ同士を比較して包含関係を判別する演算子が追加されたみたい。
これすげー便利だな。
def hash_operators puts ({a:1, b:2} > {a:1}) # true - A ⊃ B の関係である puts ({a:1} >= {a:1}) # true - A ⊇ B の関係である puts ({a:1, b:2} < {a:1}) # false - A ⊂ B の関係でない end
詳しくはココらへんのTicketに色々書かれてるのかな??
did_you_mean gem is bundled
NameError や NoMethodError が発生した際に正しい名前の候補を表示してくれる did_you_mean gemがRuby 2.3から標準でbundleされるようになったらしい。
そもそもdid_you_mean知らなかった俺には、すげーなこれ!としか言えない。
でもMatzがRebuildで何度かこれっぽい話してたような気がする。これの話じゃないかもしれないけど。
# メソッド名typoして実行してみると puts "Hello".revers! # こんな感じでエラー内容が出てくる # 正しいメソッド名の候補を出してくれるのね、最高やんけ ruby_2_3_test.rb:89:in `<main>': undefined method `revers!' for "Hello":String (NoMethodError) Did you mean? reverse! reverse
Module#deprecate_constant
非推奨となった定数にマークを付ける Module#deprecate_constant
が追加されたみたい。
マークを付けた定数の参照時に警告が出力されるよー、ごいすー!
class ::Foo BAR = 'Deprecated constant' # BARは deprecated (非推奨)な定数とする deprecate_constant :BAR end puts Foo::BAR # ruby_2_3_test.rb:90: warning: constant Foo::BAR is deprecated
まとめ
他にもRuby 3.0に向けた文字列リテラルをデフォルトでfreezeさせるマジックコメントの追加とか面白そうなのあったねー。
久々に新しいRubyをキメてみたけど気持ちいい!
ゆるびぃ会の宣伝
Rubyの勉強会のはずが、それ以外の話題でばかり盛り上がっているただのゆるい会というゆるびぃ会というものをやってるので、Rubyの話とか興味ある人、ゆるびぃ会でゆるく話していただけると非常に嬉しいです!