こんにちは。Ruby の記事です。
クリスマスプレゼント( Ruby 2.7 )が楽しみですね。
今日はちょっと味見をして、Ruby 2.7.0-preview3 でクイズを出したいと思います。
もちろんプレビュー版なので、実際の 2.7 では仕様変更がある可能性があります。お気をつけください!
第1問
-> { _1.nil? }.call(true)
#=> ?
true
false
Error
答えは…
2. false
(↑色反転↑)
第2問
(nil..).max.nil?
#=> ?
true
false
Error
答えは…
3. Error (RangeError)
(↑色反転↑)
第3問
(..nil).min.nil?
#=> ?
true
false
Error
答えは…
1. true
(↑色反転↑)
第4問
{ dog: 'うま', cat: 'ねこ', dog: 'いぬ' } in
{ cat: 'ねこ', dog: 'いぬ' }
#=> ?
true
false
Error
答えは…
1. true
(↑色反転↑)
第5問
{ cat: 'ねこ', dog: 'いぬ' } in
{ dog: 'うま', cat: 'ねこ', dog: 'いぬ' }
#=> ?
true
false
Error
答えは…
3. Error (SyntaxError)
(↑色反転↑)
第6問
case [true, false, false, true]
in [_, *_, _]
[*_].first
end
#=> ?
true
false
nil
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
と違ってこちらは min
で nil
が返ってきます。
Ruby 2.6.5 の時点で (nil..nil).min
は nil
を返します。
第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