読者です 読者をやめる 読者になる 読者になる

Ruby 2.3をキメると気持ちいい

Ruby

ここ一年くらいRubyやってなかったし、初心者以下のレベルの俺が「Ruby 2.3出たし、キメてみるか」って感じでキメてみた話

ちなみに、Ruby全然初心者なのでこれまでどうだったかとか全く知らずに書いてるので、マサカリ投げられても困っちゃうからよろしくヽ(´ー`)ノ

結論からいうと、Ruby 2.3をキメると気持ちいい

Ruby 2.3.0 Released

毎年予告通りにクリスマス(12/25)に Ruby 2.3.0がリリースされましたね。

毎年できるとか素晴らしい!

Ruby 2.3.0 Released

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の記事を参考に面白いそうなやつだけ試してみた

qiita.com

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

型情報でもgrepできるんだね!Rubyすげー!

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に色々書かれてるのかな??

bugs.ruby-lang.org

did_you_mean gem is bundled

NameError や NoMethodError が発生した際に正しい名前の候補を表示してくれる did_you_mean gemRuby 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の話とか興味ある人、ゆるびぃ会でゆるく話していただけると非常に嬉しいです!

yuruby.connpass.com

ちなみに、RubyじゃないことでもOK。俺、ゆるびぃ会でRubyの話した記憶がないでござるー。