Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ruby3.0 の Hash#each のブロック #2756

Open
foomin10 opened this issue Nov 5, 2022 · 0 comments
Open

Ruby3.0 の Hash#each のブロック #2756

foomin10 opened this issue Nov 5, 2022 · 0 comments

Comments

@foomin10
Copy link
Contributor

foomin10 commented Nov 5, 2022

Hash#each がアンパサンドを使ってブロックを渡すときの動作が変更されています。

2.7 までは、キーと値で yield するか key-value 配列で yield するかはブロックパラメータの個数で決まります。ブロックなしの場合はそのように yield する Enumerator を返します。

3.0 からは、直接ブロックありの場合はブロックパラメータの個数で決まりますが、アンパサンドの場合は常に key-value 配列で yield します。ブロックなしの場合はそのように yield する Enumerator を返します。

# NG: 2引数を受ける lambda を渡すのがエラーになった
{ foo: 100 }.each(&->(k,v){ p [k, v] })
#~> wrong number of arguments (given 1, expected 2) (ArgumentError)

# OK: 配列として受ける
{ foo: 100 }.each(&->(ary){ p [ary[0], ary[1]] })
#=> [:foo, 100]

# OK: 配列として受け、分配する
{ foo: 100 }.each(&->((k,v)){ p [k, v] })
#=> [:foo, 100]

# OK: 直接ブロックは変更なし(2個なら key と value)
{ foo: 100 }.each {|k,v| p [k, v] }
#=> [:foo, 100]

# OK: 直接ブロックは変更なし(1個なら key-value 配列)
{ foo: 100 }.each {|(k,v)| p [k, v] }
#=> [:foo, 100]

参照: サンプルコードでわかる!Ruby 3.0の主な新機能と変更点 Part 2 - 新機能と変更点の総まとめ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant