# Verifying keyword arguments

**URL:** <https://www.ruby-forum.com/t/verifying-keyword-arguments/55839>\
**Category:** Ruby\
**Created:** [March 24, 2006, 7:23am UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839 "2006-03-24T07:23:58Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![eliben](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3bc359/32.png) [@eliben](https://www.ruby-forum.com/u/eliben)\
**Post date:** [March 24, 2006, 7:23am UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839/1 "2006-03-24T07:23:58Z")

</div>

Hello all,

I’m now writing my first real Ruby module, and on the second function I  
already run into a pattern that seems to be very common.  
I like using keyword arguments for methods, as follows:

def method(args)  
…  
end

And then call:

method(:arg1 =\> value1, :arg2 =\> value2)

And so on.  
Now, often some arguments are compulsory, so I wrote the following code  
to verify it:

def method(args)  
[:username, :password, :url].each do |arg|  
raise(ArgumentError, “Argument :#{arg} is compulsory” unless  
args.has\_key?(arg)  
end

…  
end

I have two questions:

1. Is this the right/idiomatic/best way to achieve what I’m attempting  
?
2. Is there a library that encapsulates this capability, or is everyone  
writing one of his own ? Because if I don’t find any, I surely will  
write one… It should be enough saying:

verify\_args(:username, :password, :url)

Instead of the .each do iteration everywhere

Eli

---

<div class="post-metadata">

**Author:** ![eliben](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3bc359/32.png) [@eliben](https://www.ruby-forum.com/u/eliben)\
**Post date:** [March 24, 2006, 3:37pm UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839/2 "2006-03-24T15:37:34Z")

</div>

On Fri, 24 Mar 2006, Eli B. wrote:

> And then call:  
> args.has\_key?(arg)  
> write one… It should be enough saying:
> 
> verify\_args(:username, :password, :url)
> 
> Instead of the .each do iteration everywhere
> 
> Eli

[http://codeforpeople.com/lib/ruby/](http://codeforpeople.com/lib/ruby/)  
[http://codeforpeople.com/lib/ruby/parseargs/parseargs-0.3.0/README](http://codeforpeople.com/lib/ruby/parseargs/parseargs-0.3.0/README)

regards.

-a

---

<div class="post-metadata">

**Author:** ![eliben](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3bc359/32.png) [@eliben](https://www.ruby-forum.com/u/eliben)\
**Post date:** [March 25, 2006, 6:04am UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839/3 "2006-03-25T06:04:02Z")

</div>

Eli B. wrote:

> And then call:  
> args.has\_key?(arg)  
> write one… It should be enough saying:
> 
> verify\_args(:username, :password, :url)
> 
> Instead of the .each do iteration everywhere
> 
> Eli

Is this topic of no interest to anyone but me ? :-/

---

<div class="post-metadata">

**Author:** ![eliben](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3bc359/32.png) [@eliben](https://www.ruby-forum.com/u/eliben)\
**Post date:** [March 25, 2006, 11:03am UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839/4 "2006-03-25T11:03:00Z")

</div>

On Sat, 2006-03-25 at 14:03 +0900, Eli B. wrote:

> > ```
> > raise(ArgumentError, "Argument :#{arg} is compulsory" unless
> > 
> > ```
> > 
> > args.has\_key?(arg)  
> > end
> > 
> > …  
> > end
> > 
> > I have two questions:
> > 
> > 1. Is this the right/idiomatic/best way to achieve what I’m attempting  
> > ?

It works, and strikes me as more compact and elegant than a simple  
‘raise unless args[:username] && args[:password] && …’.

> > 1. Is there a library that encapsulates this capability, or is everyone  
> > writing one of his own ? Because if I don’t find any, I surely will  
> > write one… It should be enough saying:
> > 
> > verify\_args(:username, :password, :url)
> > 
> > Instead of the .each do iteration everywhere

Not sure about libraries (though I’m sure they are out there, check RAA  
and Rubyforge) but here’s a little trick I’ve used before:

args = { :one =\> ‘two’, :three =\> ‘four’ }

# =\> {:three=\>“four”, :one=\>“two”}

h = Hash.new { |h,k| raise ArgumentError, “#{k}” }.merge(args)

# =\> {:three=\>“four”, :one=\>“two”}

h[:one]

# =\> “two”

h[:three]

# =\> “four”

h[:two]  
ArgumentError: two  
from (irb):5  
from (irb):11

This way, you never actually check the arguments explicitly, but you’ll  
be told if your method uses one that wasn’t passed. Obviously for  
optional arguments you go to the original hash.

---

<div class="post-metadata">

**Author:** ![eliben](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3bc359/32.png) [@eliben](https://www.ruby-forum.com/u/eliben)\
**Post date:** [March 25, 2006, 3:09pm UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839/5 "2006-03-25T15:09:01Z")

</div>

Ross B. wrote:

> > > end  
> > > [:username, :password, :url].each do |arg|
> 
> > >
> 
> h[:one]  
> This way, you never actually check the arguments explicitly, but you’ll  
> be told if your method uses one that wasn’t passed. Obviously for  
> optional arguments you go to the original hash.

This is a nice trick that can be used to handle optional keyword  
variables with default values, and indeed it helps detect unwanted  
variables.  
I think it can be somehow combined with the method I presented - the  
aim of which is to detect if any compulsory argument wasn’t passed in.  
After all, there are arguments for which a default value is  
meaningless.

Eli – ([http://eliben.blogspot.com](http://eliben.blogspot.com))

---

<div class="post-metadata">

**Author:** ![eliben](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3bc359/32.png) [@eliben](https://www.ruby-forum.com/u/eliben)\
**Post date:** [March 25, 2006, 10:08pm UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839/6 "2006-03-25T22:08:16Z")

</div>

Ross B. wrote:  
…

> # =\> “two”
> 
> be told if your method uses one that wasn’t passed. Obviously for  
> optional arguments you go to the original hash.

What about using rescue for optional arguments? It might be slower  
though.

---

<div class="post-metadata">

**Author:** ![eliben](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3bc359/32.png) [@eliben](https://www.ruby-forum.com/u/eliben)\
**Post date:** [March 26, 2006, 7:29pm UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839/7 "2006-03-26T19:29:03Z")

</div>

Joel VanderWerf wrote:

> > This way, you never actually check the arguments explicitly, but you’ll  
> > be told if your method uses one that wasn’t passed. Obviously for  
> > optional arguments you go to the original hash.
> 
> What about using rescue for optional arguments? It might be slower though.

What do you mean ? Can you provide an example ?

---

<div class="post-metadata">

**Author:** ![eliben](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/3bc359/32.png) [@eliben](https://www.ruby-forum.com/u/eliben)\
**Post date:** [March 26, 2006, 9:29pm UTC](https://www.ruby-forum.com/t/verifying-keyword-arguments/55839/8 "2006-03-26T21:29:35Z")

</div>

Eli B. wrote:

> > > # =\> {:three=\>“four”, :one=\>“two”}
> > > 
> > > ```
> > > from (irb):11
> > > 
> > > ```
> > > 
> > > This way, you never actually check the arguments explicitly, but you’ll  
> > > be told if your method uses one that wasn’t passed. Obviously for  
> > > optional arguments you go to the original hash.
> > 
> > What about using rescue for optional arguments? It might be slower though.
> 
> What do you mean ? Can you provide an example ?

args = { :one =\> ‘two’, :three =\> ‘four’ }

# =\> {:three=\>“four”, :one=\>“two”}

h = Hash.new { |h,k| raise ArgumentError, “#{k}” }.merge(args)

# =\> {:three=\>“four”, :one=\>“two”}

h[:one]

# =\> “two”

h[:three]

# =\> “four”

v = h[:two] rescue “this string is the default for ‘two’”  
p v

# =\> “this string is the default for ‘two’”
