module NameIs def name "name is #{super}" end end class Homu # prepend すると先に NameIs のメソッドが呼ばれる prepend NameIs def name "homu" end end # Homu の継承リスト p Homu.ancestors # => [NameIs, Homu, Object, Kernel, BasicObject] p Homu.new.name # => "name is homu"
module StringEx # refine を使って String に新しいメソッドを定義する refine String do def twice self + self end end end # using したファイルでのみ String#twice が使える using StringEx p "homu".twice Ruby 2.0.0 リリース特集 Ruby 2.0.0 の注意点やその他の新機能
ファイルだけではなくて class の中でも using できるようになった キーワード引数でデフォルト値を省略できるように変更 Ruby 2.0 ではデフォルト値が必須だった 新しい整数リテラルとして r と i が追加 メソッドを定義する def がメソッド名のシンボルを返すように変更 参照: 2013/12/25 にリリース NEWS p 42r.class # => Rational p 42i.class # => Complex method_name = def twice(value:) value + value end p method_name # => :twice NEWS for Ruby 2.1.0 (Ruby 3.0.0 リファレンスマニュアル)
rescue/else/ensure が do/end ブロック内にも直接書けるように変更 トップレベルの定数探索の仕組みが変更 2017/12/25 にリリース NEWS # do ~ ensure ~ end をまとめてかける hoge do # ... ensure # ... end class User; end class Address; end # 2.4 まではトップレベルの定数まで探索されてしまっていた p Address::User # 2.4 => User # 2.5 => error: uninitialized constant Address::User (NameError)
パターンマッチを 1 ⾏でかける構⽂ これは Ruby 3.0 では実験的な機能になる 使⽤すると実験的な警告が出るので注意 Ruby 2.7 でも使⽤できるが挙動がちょっと違うので注意 # これは普通のパターンマッチ case user in { name: String, age: (..20) } end # 上のパターンマッチが 1 ⾏でかける # マッチしてたら true を返し、そうでなければ false を返す # warning: One-line pattern matching is experimental, and the behavior may change in future versions of Ruby! user in { name: String, age: (..20) }
ゃったエイプリルフールネタ # end を書かずにメソッドが定義できる # 引数がある場合は () は省略できないので注意 def twice(a) = a + a p twice 42 # => 84 # 引数がない場合は () は省略できる def value = 42 # また = 付きメソッドは定義できないので注意 # error: setter method cannot be defined in an endless method definition def value=(value) = @value = value
# Ractor.new のブロックが並列処理として実⾏される # .new の引数をブロックの引数として受け取る事ができる ractor = Ractor.new(10) do |loop_count| loop_count.times do puts :hello sleep 0.3 end end # 並列処理が終了するまでブロッキングする # p ractor.take 10.times do puts :world sleep 0.3 end