From 543a82730df1237564bfcad62897f871836caae1 Mon Sep 17 00:00:00 2001 From: jbranchaud Date: Sat, 16 Nov 2024 12:32:21 -0600 Subject: [PATCH] Add Forward All Arguments To Another Method as a Ruby TIL --- README.md | 3 +- ...forward-all-arguments-to-another-method.md | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 ruby/forward-all-arguments-to-another-method.md diff --git a/README.md b/README.md index 7133bb7..e1e9dab 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). -_1508 TILs and counting..._ +_1509 TILs and counting..._ --- @@ -1221,6 +1221,7 @@ _1508 TILs and counting..._ - [Find The Min And Max With A Single Call](ruby/find-the-min-and-max-with-a-single-call.md) - [Finding The Source of Ruby Methods](ruby/finding-the-source-of-ruby-methods.md) - [Format A Hash Into A String Template](ruby/format-a-hash-into-a-string-template.md) +- [Forward All Arguments To Another Method](ruby/forward-all-arguments-to-another-method.md) - [Generate A Signed JWT Token](ruby/generate-a-signed-jwt-token.md) - [Generate Ruby Version And Gemset Files With RVM](ruby/generate-ruby-version-and-gemset-files-with-rvm.md) - [Get Info About Your RubyGems Environment](ruby/get-info-about-your-ruby-gems-environment.md) diff --git a/ruby/forward-all-arguments-to-another-method.md b/ruby/forward-all-arguments-to-another-method.md new file mode 100644 index 0000000..d81372b --- /dev/null +++ b/ruby/forward-all-arguments-to-another-method.md @@ -0,0 +1,45 @@ +# Forward All Arguments To Another Method + +There are three types of arguments that a Ruby method can receive. Positional +arguments, keyword arguments, and a block argument. + +A method that deals with all three might be defined like this: + +```ruby +def forwarding_method(*args, **kwargs, &block) + # implementation +end +``` + +Now lets say we have some concrete method that we want to forward these +arguments to: + +```ruby +def concrete_method(*args, **kwargs) + x = args.first || 1 + key, y = kwargs.first || [:a, 2] + + puts "Dealing with #{x} and key #{key}: #{y}" + + yield(x, y) +end +``` + +We could forward arguments the longhand way like this: + +```ruby +def forwarding_method(*args, **kwargs, &block) + concrete_method(*args, **kwargs, &block) +end +``` + +However, since Ruby 2.7 we have access to a shorthand "triple-dot" syntax for +forwarding all arguments. + +```ruby +def forwarding_method(...) + concrete_method(...) +end +``` + +[source](https://ruby-doc.org/3.3.6/syntax/methods_rdoc.html#label-Argument+Forwarding)