こんにちは。Ruby の記事です。
クリスマスプレゼント( Ruby 2.7 )が楽しみですね。
今日はちょっと味見をして、Ruby 2.7.0-preview3 でクイズを出したいと思います。

もちろんプレビュー版なので、実際の 2.7 では仕様変更がある可能性があります。お気をつけください!

第1問

-> { _1.nil? }.call(true)
#=> ?
  1. true
  2. false
  3. Error

答えは…
2. false
(↑色反転↑)

第2問

(nil..).max.nil?
#=> ?
  1. true
  2. false
  3. Error

答えは…
3. Error (RangeError)
(↑色反転↑)

第3問

(..nil).min.nil?
#=> ?
  1. true
  2. false
  3. Error

答えは…
1. true
(↑色反転↑)

第4問

{ dog: 'うま', cat: 'ねこ', dog: 'いぬ' } in
  { cat: 'ねこ', dog: 'いぬ' }
#=> ?
  1. true
  2. false
  3. Error

答えは…
1. true
(↑色反転↑)

第5問

{ cat: 'ねこ', dog: 'いぬ' } in
  { dog: 'うま', cat: 'ねこ', dog: 'いぬ' }
#=> ?
  1. true
  2. false
  3. Error

答えは…
3. Error (SyntaxError)
(↑色反転↑)

第6問

case [true, false, false, true]
in [_, *_, _]
  [*_].first
end
#=> ?
  1. true
  2. false
  3. nil
  4. Error

答えは…
1. true
(↑色反転↑)

第1問の解説

-> { _1.nil? }.call(true)
#=> false

Numbered parameters をブロック内で使用すると、ブロック引数がその数まで拡張されます。

-> { _9 }.arity
#=> 9

ちなみに、使える数字は _9 までです。

第2問の解説

(nil..).max.nil?
#=> RangeError (cannot get the maximum of endless range)

読んで字の如し。

第3問の解説

(..nil).min.nil?
#=> true

第2問の max と違ってこちらは minnil が返ってきます。
Ruby 2.6.5 の時点で (nil..nil).minnil を返します。

第4問の解説

{ dog: 'うま', cat: 'ねこ', dog: 'いぬ' } in
  { cat: 'ねこ', dog: 'いぬ' }
#=> true

{ dog: 'うま', cat: 'ねこ', dog: 'いぬ' }{ dog: 'いぬ', cat: 'ねこ' } と解釈されるため、true になります。

第5問の解説

{ cat: 'ねこ', dog: 'いぬ' } in
  { dog: 'うま', cat: 'ねこ', dog: 'いぬ' }
#=> SyntaxError (duplicated key name)

in 式に渡す Hash はキーの重複が許されません(通常の Hash でも Warning でますが)。

第6問の解説

case [true, false, false, true]
in [_, *_, _]
  [*_].first
end
#=> true

これは引数と同じく、in*_ に余りが格納されます。
つまり in [true, [false, false], true] の形になり、
最後の true_ が上書きされ、[true].first #=> true となります。

おわりの言葉

最初は「Ruby 2.7 で極まる難読クイズ」をやる予定だったんですが、
難読クイズの素材のメソッド参照演算子( .: )が preview3 で消えてしまっていたので、急遽ふつうのクイズになりました。ショック…。

でも 2.7 はパターンマッチが最高なのでニッコニコ。

User = Struct.new(:name, :age, :active)
user = User.new('rigani', 3, true)

user in User(active: true, age: ..3)
#=> true