From b7d4a62ecb6561c69d0eb65762e098aaa8979b12 Mon Sep 17 00:00:00 2001 From: jbranchaud Date: Wed, 1 Jan 2025 12:16:53 -0600 Subject: [PATCH] Add Refer To Implicit Block Argument With It as a Ruby TIL --- README.md | 3 +- ...efer-to-implicit-block-argument-with-it.md | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 ruby/refer-to-implicit-block-argument-with-it.md diff --git a/README.md b/README.md index 78eeb42..cbaa190 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1554 TILs and counting..._ +_1555 TILs and counting..._ --- @@ -1303,6 +1303,7 @@ _1554 TILs and counting..._ - [Question Mark Operator](ruby/question-mark-operator.md) - [Rake Only Lists Tasks With Descriptions](ruby/rake-only-lists-tasks-with-descriptions.md) - [Read The First Line From A File](ruby/read-the-first-line-from-a-file.md) +- [Refer To Implicit Block Argument With It](ruby/refer-to-implicit-block-argument-with-it.md) - [Rendering ERB](ruby/rendering-erb.md) - [Replace The Current Process With An External Command](ruby/replace-the-current-process-with-an-external-command.md) - [Require Entire Gemfile In Pry Session](ruby/require-entire-gemfile-in-pry-session.md) diff --git a/ruby/refer-to-implicit-block-argument-with-it.md b/ruby/refer-to-implicit-block-argument-with-it.md new file mode 100644 index 0000000..576be48 --- /dev/null +++ b/ruby/refer-to-implicit-block-argument-with-it.md @@ -0,0 +1,43 @@ +# Refer To Implicit Block Argument With It + +One of the key features of the Ruby 3.4 release is the `it` implicit block +argument. + +The vast majority of inline blocks defined in Ruby code receive a single block +argument. Typically we name and reference a block argument explictly like so: + +```ruby +items.map { |item| item * item } +``` + +Ruby likes to cut away excess syntax when possible. To that end, the implicit +`it` block argument has been added. This is an identifier we can reference in +the context of a block and its value is the current + +```ruby +items = [1,2,3,4,5] + +squares = items.map { it * it } + +pp squares +#=> [1, 4, 9, 16, 25] +``` + +Note: we cannot mix numbered parameters (`_1`, `_2`) with the `it` parameter. +If we do, we'll get the following error: + +```ruby +def method_using_block(a, b) + yield(a, b) if block_given? +end + +puts method_using_block(4,5) { _2 ** _1 } #=> 625 +puts method_using_block(4,5) { _2 ** it } +# it_block.rb:12: syntax error found (SyntaxError) +# 10 | +# 11 | puts method_using_block(4,5) { _2 ** _1 } +# > 12 | ... it } +# | ^~ `it` is not allowed when a numbered parameter is already used +``` + +[source](https://docs.ruby-lang.org/en/3.4/NEWS_md.html)