サンプルコードでわかる！Ruby 2.5の主な新機能と変更点 Part 1


## はじめに

Rubyは毎年12月25日にアップデートされます。

今年はまだpreview版がリリースされていませんが（2017年10月10日時点）、今年もそろそろリリースの日が近づいてきました。

Ruby 2.5については2017年10月10日にpreview1がリリースされました。

[Ruby 2\.5\.0\-preview1 Released](https://www.ruby-lang.org/en/news/2017/10/10/ruby-2-5-0-preview1-released/)

そこでこの記事ではこの2.5.0-preview1を参考にして、おそらくこんな感じでリリースされるであろうRuby 2.5の新機能や変更点をまとめてみました。

### 2017.12.25追記: Part 2もあります！

この記事を公開したあとにも多数新機能が追加されました。この記事に追記すると長くなってしまうので、Part 2として公開しています。こちらもあわせてご覧ください。

[サンプルコードでわかる！Ruby 2\.5の主な新機能と変更点 Part 2 \- Qiita](https://qiita.com/jnchito/items/0d2d17a79a3e82fe3815)

### 本記事の情報源

本記事は以下のNEWSページに掲載されている情報から、個人的に注目したい新機能をピックアップしたものです。

[NEWS（commit: 6c29f23）](https://github.com/ruby/ruby/blob/6c29f232a733228507a39fbc9f30b89ee960b165/NEWS)

この記事に掲載していない変更点もあるので、詳細はNEWSページをご覧ください。

また、説明している内容に間違いがあれば、コメントや編集リクエスト等で優しく指摘してやってください。
ここで紹介していない新機能に関する編集リクエストも大歓迎です！

### 動作確認したRubyのバージョン

本記事は以下の環境で実行した結果を記載しています。

```
$ ruby -v
ruby 2.5.0preview1 (2017-10-10 trunk 60153) [x86_64-darwin16]
```

**2017.12.26追記: 正式リリース版でも動作確認しました**

正式リリースされたRuby 2.5.0でも動作確認を行いました。

```
$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16]
```

また、Ruby 2.5.0の最終的なNEWSページはこちらになります。

- [NEWS](https://github.com/ruby/ruby/blob/v2_5_0/NEWS)

### コード例

本記事のコード例は以下のGitHubリポジトリに置いています。

https://github.com/JunichiIto/ruby-2-5-sandbox

それでは以下が本編です！

## 言語仕様上の変更点

### do/endブロック内でbegin/endなしのrescue/else/ensureが書けるようになった

Ruby2.5ではブロック内でbegin/endなしのrescue/else/ensureが書けるようになりました。
これによりネストの深さと行数を節約できます。

```ruby
# Ruby 2.4
[1].each do |n|
  begin
    n / 0
  rescue
    # rescue
  else
    # else
  ensure
    # ensure
  end
end

# Ruby 2.5
[1].each do |n|
  n / 0
rescue
  # rescue
else
  # else
ensure
  # ensure
end
```

ただし、ブロックを`{}`で書いた場合は構文エラーになります。

```ruby
[1].each { |n|
  n / 0
rescue
  # rescue
else
  # else
ensure
  # ensure
}
#=> SyntaxError: (irb):3: syntax error, unexpected keyword_rescue, expecting '}'
#     rescue
#     ^~~~~~
```

do/endと{}で挙動が変わるの？と思ってしまったんですが、むしろ{}を除外することで提案が通ったそうです。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">今までも何回か提案されていたけれど、{…rescue…}の違和感からrejectされ続けてきたモノなので、むしろ{}を除外したというのが今回通ったポイント <a href="https://t.co/eDNlrtlUwE">https://t.co/eDNlrtlUwE</a></p>&mdash; †ꁐ𐨥ᐠ†-̱̏ (@n0kada) <a href="https://twitter.com/n0kada/status/894714200148262912?ref_src=twsrc%5Etfw">August 8, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

- 参考: [Feature \#12906: do/end blocks work with ensure/rescue/else](https://bugs.ruby-lang.org/issues/12906)

### トップレベルの定数探索のルールが変更された

下のような3つのクラスがあったとします。

```ruby
# Ruby 2.4
class Item; end
class Staff; end
class ItemsController; end
```

さらにこの状態から、次のクラスを参照します。

```ruby
Staff::ItemsController
```

ぱっと見、「こんなクラスは定義してないよ！」と思うかもしれませんが、Ruby 2.4では（警告付きで）ItemsControllerを参照したことになります。

```ruby
# Ruby 2.4
Staff::ItemsController
#=> warning: toplevel constant ItemsController referenced by Staff::ItemsController
#=> ItemsController
```

なぜなら、トップレベルのクラス定義はObjectクラス以下にクラスが定義され、さらにRubyはStaffクラス、Objectクラスと順に継承関係をさかのぼってItemsControllerが定義されていないか探しに行っていたためです。

しかし、この仕様はプログラマが本来求めているものと異なるクラスが返される恐れがあり、わかりづらい不具合の原因になっていました。
（[こちらの記事](https://qiita.com/jnchito/items/79aaca1c51a0ca20ba6e)で詳しく説明しています。）

そこでRuby 2.5では、継承関係をさかのぼらなくなりました（Staffクラス以下にItemsControllerが定義されていなければエラー）。

```ruby
# Ruby 2.5
Staff::ItemsController
#=> NameError: uninitialized constant Staff::ItemsController
#   Did you mean?  ItemsController
```

ItemsControllerを参照するためには、以下のいずれかの方法をとることになります（この書き方はいずれもRuby 2.4でも有効です）。

```ruby
ItemsController
Object::ItemsController
::ItemsController
```

- 参考: [Feature \#11547: remove top\-level constant lookup](https://bugs.ruby-lang.org/issues/11547)

### refinementsでto_sを書き換えたときに、文字列の式展開でもrefinements側のto_sが使われるようになった

次のようなrefinementsを使ったクラス定義があったとします。

```ruby
class A
end

module B
  refine A do
    def to_s
      'b'
    end
  end
end

class C
  using B

  def initialize
    @a = A.new
  end

  def c1
    @a.to_s
  end

  def c2
    "#{@a}"
  end
end
```

さらにクラスCのc1メソッドとc2メソッドを次のように呼び出します。

```ruby
C.new.c1
C.new.c2
```

明示的に`to_s`メソッドを呼びだしているc1メソッドはもちろん、式展開で暗黙的に`to_s`が使われるc2メソッドもどちらも同じ結果になる（module Bのrefinementsが有効になっている）と思いますが、Ruby 2.4ではこのようになっていました。

```ruby
# Ruby 2.4
C.new.c1 #=> "b"
C.new.c2 #=> "#<A:0x00007f870a852d50>"
```

ごらんのとおり、c2メソッド（式展開を使った場合）はrefinementsが有効になっていません。
ですが、Ruby 2.5ではどちらもrefinementsが有効になりました。

```ruby
# Ruby 2.5
C.new.c1 #=> "b"
C.new.c2 #=> "b"
```

- 参考: [Feature \#13812: Refinements で定義した to\_s を String interpolation が呼んでくれない](https://bugs.ruby-lang.org/issues/13812)

## 標準ライブラリ関連の変更点

### 
Bundlerが標準ライブラリに取り込まれた


Bundlerの標準添付は急きょ延期されたとのことです（[参考](https://github.com/ruby/ruby/commit/7825e8363d4b2ccad8e2d3f5eeba9e26f6656911)）。


Bundlerが標準ライブラリに取り込まれました。なので、`gem install bundler`なしでBundlerが使えるようになります。


- 
参考: [Feature \#12733: Bundle bundler to ruby core](https://bugs.ruby-lang.org/issues/12733)


### ERBのローカル変数をHashで渡せる ERB#result_with_hash メソッド
これまでERBでテンプレート内で使われるローカル変数を渡すには、以下のようにbindingを渡したり、あるいは渡す変数を絞るために[structを定義する](https://github.com/search?q=erb+result+openstruct&type=Code&ref=searchresults)必要がありました。

```rb
require 'erb'
require 'ostruct'

namespace = OpenStruct.new(a: 2, b: 3)
template = 'Result: <%= a * b %>'
ERB.new(template).result(namespace.instance_eval { binding }) #=> "Result: 6"
```

これが、`ERB#result_with_hash`の導入により、最低限の変数だけ渡すのが以下のように簡単に書けるようになりました。

```rb
require 'erb'

ERB.new('Result: <%= a * b %>').result_with_hash(a: 2, b: 3) #=> "Result: 6"
```

- 参考: [Feature \#8631: Add a new method to ERB to allow assigning the local variables from a hash](https://bugs.ruby-lang.org/issues/8631)

## 実験中の変更点

### バックトレースの表示順が逆になる？

（この仕様変更はこの記事を公開したあとにいくつか変更された点があるので、Part 2であらためて説明しています。）

[サンプルコードでわかる！Ruby 2\.5の主な新機能と変更点 Part 2 \- Qiita](https://qiita.com/jnchito/items/0d2d17a79a3e82fe3815#%E3%83%90%E3%83%83%E3%82%AF%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9%E3%81%AE%E8%A1%A8%E7%A4%BA%E9%A0%86%E3%81%8C%E9%80%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F)

## オブジェクト全般の新機能

### ブロックの実行結果がそのまま戻り値になるyield_self

Ruby 2.5ではレシーバがブロックの引数になり、ブロックの結果がそのまま戻り値になる`yield_self`が追加されました。
Kernelモジュールのメソッドなので、すべてのオブジェクト（BasicObjectを除く）で使用できます。

```ruby
# レシーバ（= 2）を受け取り、ブロックの戻り値（= 2 * 10）がメソッド全体の戻り値になる
2.yield_self { |n| n * 10 } #=> 20
```

以下は配列に含まれる文字列をカンマで連結し、さらにそれを丸括弧で囲むコード例です。

```ruby
names = ['Alice', 'Bob']
names.join(', ').yield_self { |s| "(#{s})" } #=> "(Alice, Bob)"
```

ちなみに、`yield_self`についてはこちらの記事でも紹介されています。

[Ruby2\.5で導入されるyield\_selfについて \- Qiita](https://qiita.com/opt-link/items/8195f3a03859bcb10920)

- 参考: [Feature \#6721: Object\#yield\_self](https://bugs.ruby-lang.org/issues/6721)

## 文字列/正規表現に関する新機能

### 接頭辞や接尾辞を削除するdelete_prefix/delete_suffix

Ruby 2.5では文字列から接頭辞や接尾辞を削除する`delete_prefix`と`delete_suffix`が追加されました。

```ruby
'invisible'.delete_prefix('in') #=> "visible"
'pink'.delete_prefix('in') #=> "pink"

'worked'.delete_suffix('ed') #=> "work"
'medical'.delete_suffix('ed') #=> "medical"
```

- 参考: [Feature \#12694: Want a String method to remove heading substr](https://bugs.ruby-lang.org/issues/12694)
- 参考: [Feature \#13665: String\#delete\_suffix](https://bugs.ruby-lang.org/issues/13665)

### casecmp/casecmp?に文字列以外の引数を渡したときに例外ではなくnilを返すようになった

Ruby 2.5では`casecmp/casecmp?`メソッドに文字列以外の引数（数値など）を渡したときに`nil`を返すようになりました。

```ruby
# Ruby 2.4
'abc'.casecmp(1)  #=> TypeError
'abc'.casecmp?(1) #=> TypeError

# Ruby 2.5
'abc'.casecmp(1)  #=> nil
'abc'.casecmp?(1) #=> nil
```

シンボルでは以前から`nil`を返していたいので、それに挙動を合わせたようです。

```ruby
# Ruby 2.4, 2.5
:abc.casecmp(1)  #=> nil
:abc.casecmp?(1) #=> nil
```

- 参考: [Bug \#13312: String\#casecmp raises TypeError instead of returning nil](https://bugs.ruby-lang.org/issues/13312)

### 正規表現で非包含オペレータが使えるようになった（Ruby 2.4.1以降）

これはRuby 2.5ではなく、Ruby 2.4.1からの新機能ですが、正規表現エンジンが鬼雲6.1.1にアップデートされ、非包含オペレータ（`(?~)`）が使えるようになりました。

以下は非包含オペレータを使って、DEBUGとINFOを含まない行を抜き出すコード例です。

```ruby
text = <<LOG
10:00 [INFO] Lorem ipsum dolor sit amet
10:10 [WARN] Lorem ipsum dolor sit amet
10:20 [INFO] Lorem ipsum dolor sit amet
10:25 [DEBUG] Lorem ipsum dolor sit amet
10:30 [ERROR] Lorem ipsum dolor sit amet
10:40 [INFO] Lorem ipsum dolor sit amet
LOG

puts text.scan(/^(?~DEBUG|INFO)$/)
#=> 10:10 [WARN] Lorem ipsum dolor sit amet
#   10:30 [ERROR] Lorem ipsum dolor sit amet
```

非包含オペレータの詳細については以下の記事を参照してください。

- [鬼雲に非包含オペレータを実装した話 \- Qiita](https://qiita.com/k-takata/items/4e45121081c83d3d5bfd)
- [Ruby 2\.4\.1新機能: Onigmo正規表現の非包含演算子\(?~ \)をチェック](https://techracho.bpsinc.jp/hachi8833/2017_03_23/37689)

### Unicode 10をサポートするようになった

Ruby 2.5ではUnicode 10をサポートするようになりました。


これにより、たとえば正規表現で[変体仮名](http://yanok.net/2017/06/unicode-100.html)を表す`In_Kana_Extended_A`プロパティ（Unicode 10で追加されたプロパティ）を使えたりするようになります。

```ruby
"A\u{1B10A}B".match?(/\p{In_Kana_Extended_A}/) #=> true
```

ちなみに`\u{1B10A}`というのはこんな文字です。（大半のブラウザでは表示できないはずです）

![Screen Shot 2017-10-10 at 7.40.58.png](https://qiita-image-store.s3.amazonaws.com/0/7465/d061cea6-18cb-c353-6aa6-eb921d0f3e43.png "Screen Shot 2017-10-10 at 7.40.58.png")
http://www.unicode.org/charts/PDF/Unicode-10.0/U100-1B100.pdf

- 参考: [Feature \#13685: Update Unicode data to Unicode Version 10\.0\.0](https://bugs.ruby-lang.org/issues/13685)

## 配列に関する新機能

### unshift/pushのエイリアスメソッドとしてprepend/appendが追加された

Ruby 2.5では`unshift`/`push`のエイリアスメソッドとして`prepend`/`append`が追加されました。

```ruby
array = [3, 4]
array.prepend(1, 2) #=> [1, 2, 3, 4]
array               #=> [1, 2, 3, 4]

array = [1, 2]
array.append(3, 4)  #=> [1, 2, 3, 4]
array               #=> [1, 2, 3, 4]
```

個人的には`unshift`/`push`よりも直感的に理解しやすいメソッド名だなと思います :smiley: 

- 参考: [Feature \#12746: class Array: alias \.prepend to \.unshift ?](https://bugs.ruby-lang.org/issues/12746)

## ハッシュに関する新機能

### キーを特定のルールで変換するtransform_keys/transform_keys!

Ruby 2.5ではハッシュのキーを特定のルールで変換する`transform_keys`が追加されました。

```ruby
hash = { a: 1, b: 2 }
hash.transform_keys { |k| k.to_s }
#=> { 'a' => 1, 'b' => 2 }
```

`transform_keys!`はレシーバのハッシュ自身を変更させます（破壊的メソッド）。

```ruby
hash = { a: 1, b: 2 }
hash.transform_keys! { |k| k.to_s }
#=> { 'a' => 1, 'b' => 2 }

hash
#=> { 'a' => 1, 'b' => 2 }
```

ちなみにRuby 2.4ではハッシュの値を変換する`transform_values`メソッドが追加されていました。

```ruby
hash = {a: 1, b: 2, c: 3}
hash.transform_values {|v| v ** 2 } #=> {a: 1, b: 4, c: 9}
```

- 参考: [Feature \#13583: Adding \`Hash\#transform\_keys\` method](https://bugs.ruby-lang.org/issues/13583)

### KeyErrorにreceiverメソッドとkeyメソッドが追加された

Ruby 2.5では`fetch`メソッドなどでキーが見つからなかったときに発生するKeyErrorに`receiver`メソッドと`key`メソッドが追加されました。

`receiver`はエラーが起きたハッシュ自身を、`key`は見つからなかったキーを返します。

```ruby
begin
  h = {foo: 1, bar: 2}
  h.fetch(:bax)
rescue KeyError => e
  e.receiver #=> {:foo=>1, :bar=>2}
  e.key      #=> :bax
end
```

- 参考: [Feature \#12063: KeyError\#receiver and KeyError\#name](https://bugs.ruby-lang.org/issues/12063)

## 数値に関する新機能

### round/floor/ceil/truncateでレシーバをFloatに変換しなくなった

Ruby 2.4までは`round`メソッドを使うと、レシーバをFloatに変換してから四捨五入をしていました。

```ruby
2.round(2) #=> 2.0
```

そのため、大きな数になると丸め誤差の関係で数学的におかしな結果が返ってきていました。

```ruby
(10**25).round(2)      #=> 1.0e+25
(10**25).round(2).to_i #=> 10000000000000000905969664
```

Ruby 2.5では無理にFloatに変換しないので、数学的に正しい結果が返ります。

```ruby
2.round(2)        #=> 2
(10**25).round(2) #=> 10000000000000000000000000
```

これは`floor`/`ceil`/`truncate`についでも同様です。

```ruby
(10**25).floor(2)    #=> 10000000000000000000000000
(10**25).ceil(2)     #=> 10000000000000000000000000
(10**25).truncate(2) #=> 10000000000000000000000000
```

参考: [Feature \#13420: Integer\#\{round,floor,ceil,truncate\} should always return an integer, not a float](https://bugs.ruby-lang.org/issues/13420)

### 正しい精度で平方根を返すInteger.sqrt

`round`メソッドと同様、`Math.sqrt`メソッドも引数をFloatとして扱うために、大きな数では精度が狂うケースがありました。

```ruby
n = 10**46
# 数学的には 100000000000000000000000 が正
Math.sqrt(n).to_i #=> 99999999999999991611392
```

このようなケースではRuby 2.5で追加された`Integer.sqrt`を使うと、正しい値が返ってきます。

```ruby
n = 10**46
Integer.sqrt(n) #=> 100000000000000000000000
```

なお、平方根の値が小数になる場合は小数点以下が切り捨てられます。
引数が整数以外の数値であれば、最初に整数に変換されてから平方根を計算します。

```ruby
Math.sqrt(3)      #=> 1.7320508075688772
Integer.sqrt(3)   #=> 1
Integer.sqrt(9.9) #=> 3
```

- 参考: [Feature \#13219: bug in Math\.sqrt\(n\)\.to\_i, to compute integer squareroot, new word to accurately fix it](https://bugs.ruby-lang.org/issues/13219)

## 日時に関する新機能

### Time#atメソッドでミリ秒/ナノ秒を指定できるようになった

`Time#at`メソッドでは第1引数にエポック秒を、第2引数にマイクロ秒を指定することができます。

```ruby
def format_time(t)
  t.strftime('%Y-%m-%d %H:%M:%S.%N')
end

t = Time.at(1514127600, 1)
format_time(t) #=> "2017-12-25 00:00:00.000001000"
```

Ruby 2.5では第3引数を指定することでミリ秒やナノ秒も設定できるようになりました。

```ruby
# ミリ秒
format_time Time.at(1514127600, 1, :millisecond)
#=> "2017-12-25 00:00:00.001000000"

# マイクロ秒
format_time Time.at(1514127600, 1, :usec)
#=> "2017-12-25 00:00:00.000001000"
format_time Time.at(1514127600, 1, :microsecond)
#=> "2017-12-25 00:00:00.000001000"

# ナノ秒
format_time Time.at(1514127600, 1, :nsec)
#=> "2017-12-25 00:00:00.000000001"
format_time Time.at(1514127600, 1, :nanosecond)
#=> "2017-12-25 00:00:00.000000001"
```

- 参考: [Feature \#13919: Add a new method to create Time instances from unix time and nsec](https://bugs.ruby-lang.org/issues/13919)

## ファイル/ディレクトリ操作に関する新機能

### Dir#globメソッドに起点となるディレクトリを指定できるbaseオプションが追加された

Ruby 2.5では`Dir#glob`メソッドに起点となるディレクトリを指定できるbaseオプションが追加されました。

```ruby
# ./test/dir_aディレクトリを起点とし、".rb"で終わるファイルを探す
Dir.glob('./*.rb', base: './test/dir_a')
```

- 参考: [Feature \#13056: base option to Dir\.glob](https://bugs.ruby-lang.org/issues/13056)

### "."や".."を返さないDir#children/each_childメソッド

Rubyには指定されたパス内のファイルエントリ名を返す`Dir#entries`メソッドがあります。

```ruby
Dir.entries('./test/dir_a')
#=> ['.', '..', 'code_a.rb', 'text_a.txt']
```

ただし、上の結果を見ると分かるように`entries`メソッドでは"."や".."もファイルエントリとして返却されます。

Ruby 2.5で追加された`Dir#children`メソッドを使うと、"."や".."が含まれなくなります。

```ruby
Dir.children('./test/dir_a')
#=> ['code_a.rb', 'text_a.txt']
```

`Dir#each_child`メソッドは配列ではなく、Enumeratorオブジェクトを返します。

```ruby
Dir.each_child('./test/dir_a')
#=> #<Enumerator: Dir:each_child(\"./test/dir_a\")>"

Dir.each_child('./test/dir_a').to_a
#=> ['code_a.rb', 'text_a.txt']
```

- 参考: [Feature \#11302: Dir\.entries and Dir\.foreach without \["\.", "\.\."\]](https://bugs.ruby-lang.org/issues/11302)

## Setクラスに関する新機能

### to_sがinspectのエイリアスメソッドになった

Ruby 2.5ではSetクラスの`to_s`メソッドが`inspect`メソッドのエイリアスメソッドになりました。
これにより、要素の情報が表示されるようになります。

```ruby
require 'set'

s1 = Set.new
s1 << 'tic' << 'tac'

# Ruby 2.4
s1.to_s #=> #<Set:0x00007f83b98357e0>

# Ruby 2.5
s1.to_s #=> #<Set: {"tic", "tac"}>
```

- 参考: [Feature \#13676: to\_s method is not overriden for Set](https://bugs.ruby-lang.org/issues/13676)

### ===がinclude?のエイリアスメソッドになった

Ruby 2.5ではSetクラスの`===`が`include?`のエイリアスメソッドになりました。

```ruby
require 'set'

Set[1, 2, 3].include?(2) #=> true
Set[1, 2, 3].include?(5) #=> false

Set[1, 2, 3] === 2 #=> true
Set[1, 2, 3] === 5 #=> false
```

- 参考: [Feature \#13801: Implement case equality test for Set\#===](https://bugs.ruby-lang.org/issues/13801)

## Threadクラスに関する新機能

### スレッドに指定したキーのデータが格納されていなければデフォルト値を返すThread#fetchメソッド

Rubyでは`Thread#[]`/`[]=`を使ってスレッド固有のデータを読み書きすることができます。

```ruby
Thread.current[:foo] = 'bar'
Thread.current[:foo] #=> "bar"
```

Ruby 2.5では`Thread#fetch`メソッドが追加され、`Hash#fetch`メソッドと同じように指定されたキーが見つからないときのデフォルト値を指定することができます。

```ruby
Thread.current[:foo] = 'bar'
Thread.current.fetch(:foo, 'baz')  #=> "bar"
Thread.current.fetch(:hoge, 'baz') #=> "baz"

# 第2引数を指定しない場合はキーが見つからないとエラーになる
Thread.current.fetch(:foo)  #=> "bar"
Thread.current.fetch(:hoge) #=> KeyError: key not found: hoge
```

- 参考: [Feature \#13009: Implement fetch for Thread\.current](https://bugs.ruby-lang.org/issues/13009)

## 続きはPart 2でどうぞ！

これ以外の新機能についてはPart 2で紹介しているので、こちらもあわせてご覧ください。

[サンプルコードでわかる！Ruby 2\.5の主な新機能と変更点 Part 2 \- Qiita](https://qiita.com/jnchito/items/0d2d17a79a3e82fe3815)

## まとめ

というわけで、本記事ではRuby 2.5の新機能や変更点をまとめてみました。

do/endブロックの中にbegin/endなしでrescueが書ける点や、定数探索のルールが変わって予期せぬ不具合が発生しにくくなった点は日常的な開発で嬉しいポイントだと思います。

一方で、バックトレースの並びが逆順になるのは「うーん、ちょっと」という気がしました。
ただ、これはまだ「実験中」の仕様変更ですので、フィードバック次第では従来のままになる可能性もあります。

その他にもいろいろと興味深い新機能が追加されています。
`yield_self`なんかはこれから面白い使い方を研究していきたくなるメソッドですね。

さあ、みなさんもぜひRuby 2.5の新機能を試してみてください！

### あわせて読みたい

Ruby 2.3、2.4の新機能は以下の記事にまとめてあります。
こちらもあわせてどうぞ。

- [サンプルコードでわかる！Ruby 2\.3の主な新機能 \- Qiita](https://qiita.com/jnchito/items/0faac073cb77417d61c7)
- [サンプルコードでわかる！Ruby 2\.4の新機能と変更点 \- Qiita](https://qiita.com/jnchito/items/9f9d45581816f121af07)