# Passing only a hash key, with no value, as an option

**URL:** <https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677>\
**Category:** Ruby\
**Created:** [March 12, 2008, 1:08pm UTC](https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677 "2008-03-12T13:08:58Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![cmaxvv](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/85f322/32.png) [@cmaxvv](https://www.ruby-forum.com/u/cmaxvv)\
**Post date:** [March 12, 2008, 1:08pm UTC](https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677/1 "2008-03-12T13:08:58Z")

</div>

I’m using the method of parameter passing where i have one ‘regular’  
parameter and then a hash of options:

def chunkify(something, options = {})  
…  
end

I want to have it so that the user can just pass a key through without  
having to set it to anything, eg

dinner = chunkify(bacon, :extra\_fine)

However, ‘extra\_fine’ is just being treated as a symbol, rather than a  
hash key, and so ‘options’ is simply the symbol :extra\_fine, rather than  
the hash {:extra\_fine =\> nil}.

I can fix this by passing :extra\_fine =\> true to the method, but can i  
set up the method so it will just take the hash key, and maybe some  
other hash\_keys, some with and some without values?

thanks  
max

---

<div class="post-metadata">

**Author:** ![cmaxvv](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/85f322/32.png) [@cmaxvv](https://www.ruby-forum.com/u/cmaxvv)\
**Post date:** [March 12, 2008, 1:20pm UTC](https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677/2 "2008-03-12T13:20:35Z")

</div>

2008/3/12, Max W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> dinner = chunkify(bacon, :extra\_fine)
> 
> However, ‘extra\_fine’ is just being treated as a symbol, rather than a  
> hash key, and so ‘options’ is simply the symbol :extra\_fine, rather than  
> the hash {:extra\_fine =\> nil}.
> 
> I can fix this by passing :extra\_fine =\> true to the method, but can i  
> set up the method so it will just take the hash key, and maybe some  
> other hash\_keys, some with and some without values?

Nope. You will have to use chunkify(something, \*options) and do the  
processing yourself. Note that in no case can you mix Hash entries  
with and without values. But you can do

irb(main):006:0\> def x(\*a)p a end  
=\> nil  
irb(main):007:0\> x(:foo, :bar =\> 2)  
[:foo, {:bar=\>2}]  
=\> nil  
irb(main):008:0\>

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![cmaxvv](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/85f322/32.png) [@cmaxvv](https://www.ruby-forum.com/u/cmaxvv)\
**Post date:** [March 12, 2008, 1:22pm UTC](https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677/3 "2008-03-12T13:22:57Z")

</div>

Hi –

On Wed, 12 Mar 2008, Max W. wrote:

> dinner = chunkify(bacon, :extra\_fine)
> 
> However, ‘extra\_fine’ is just being treated as a symbol, rather than a  
> hash key, and so ‘options’ is simply the symbol :extra\_fine, rather than  
> the hash {:extra\_fine =\> nil}.
> 
> I can fix this by passing :extra\_fine =\> true to the method, but can i  
> set up the method so it will just take the hash key, and maybe some  
> other hash\_keys, some with and some without values?

You’re over-thinking this a bit. :extra\_fine isn’t any more a hash key  
than 100 is in this:

```
do_something(100)

```

The only thing that tells Ruby that you want a hash as the last  
argument, in the absence of curly braces, is the hash separator (=\>).

```
do_something(100 => "C")

```

There’s also no such thing as a hash key that isn’t part of a hash. It  
sounds like what you want to do is pass multiple objects to your  
method and create a hash from them inside the method.

David

---

<div class="post-metadata">

**Author:** ![cmaxvv](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/85f322/32.png) [@cmaxvv](https://www.ruby-forum.com/u/cmaxvv)\
**Post date:** [March 12, 2008, 1:43pm UTC](https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677/4 "2008-03-12T13:43:06Z")

</div>

2008/3/12, Max W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> I know what you’re saying, it is a bit clumsy.

Pardon me, but it seems David’s words did not sink in since you are  
still talking about a Hash key where you mean “symbol”.

> presence of a hash key acts like a switch which i can test with
> 
> if options.has\_key? :foo  
> do\_extra\_stuff  
> end
> 
> I thought i’d seen this functionality in rails, where we can pass just a  
> hash key without bothering to set it, if we want to switch something on  
> or off.

If you need a set of boolean flags then you can just use an array

irb(main):008:0\> def x(\*opts)  
irb(main):009:1\> settings = opts.inject({}){|h,o| h[o]=true;h}  
irb(main):010:1\> end  
=\> nil  
irb(main):011:0\> x(:foo, :lazy)  
=\> {:lazy=\>true, :foo=\>true}  
irb(main):012:0\>

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![cmaxvv](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/85f322/32.png) [@cmaxvv](https://www.ruby-forum.com/u/cmaxvv)\
**Post date:** [March 12, 2008, 2:25pm UTC](https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677/5 "2008-03-12T14:25:58Z")

</div>

Max W. wrote:

> I’m using the method of parameter passing where i have one ‘regular’  
> parameter and then a hash of options:
> 
> def chunkify(something, options = {})  
> …  
> end
> 
> I want to have it so that the user can just pass a key through without  
> having to set it to anything, eg
> 
> dinner = chunkify(bacon, :extra\_fine)
> 
> However, ‘extra\_fine’ is just being treated as a symbol, rather than a  
> hash key, and so ‘options’ is simply the symbol :extra\_fine, rather than  
> the hash {:extra\_fine =\> nil}.

extra\_fine is a symbol, as other people pointed out.

If that’s the only concern, then how about

def chunkify(something, options={})  
options={options=\>true} unless options.kind\_of(Hash)  
…

end

options=:extra\_fine ;=\> :extra\_fine  
options={options=\>true} unless options.kind\_of?(Hash)  
;=\>{:extra\_fine=\>true}

Then your normal processing can continue.

---

<div class="post-metadata">

**Author:** ![cmaxvv](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/85f322/32.png) [@cmaxvv](https://www.ruby-forum.com/u/cmaxvv)\
**Post date:** [March 12, 2008, 2:30pm UTC](https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677/6 "2008-03-12T14:30:42Z")

</div>

> options=:extra\_fine ;=\> :extra\_fine  
> options={options=\>true} unless options.kind\_of?(Hash)  
> ;=\>{:extra\_fine=\>true}
> 
> Then your normal processing can continue.

OK, point taken 🙂

That’s a nice snippet, thanks.

cheers all  
max

---

<div class="post-metadata">

**Author:** ![cmaxvv](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/85f322/32.png) [@cmaxvv](https://www.ruby-forum.com/u/cmaxvv)\
**Post date:** [March 12, 2008, 1:35pm UTC](https://www.ruby-forum.com/t/passing-only-a-hash-key-with-no-value-as-an-option/131677/7 "2008-03-12T13:35:50Z")

</div>

> There’s also no such thing as a hash key that isn’t part of a hash. It  
> sounds like what you want to do is pass multiple objects to your  
> method and create a hash from them inside the method.
> 
> David

Hi David

I know what you’re saying, it is a bit clumsy.

Where i’m coming from is that i often use a lot of options that are set  
to true by the user of the method if they want to use them, which does  
work nicely due to options[:foo] evaluating to nil if the user didn’t  
set it, allowing me to have tests like  
if options[:foo] #missing key equivalent to :foo =\> false  
do\_extra\_stuff  
end

I just thought it would be even nicer to have the user just be able to  
pass the hash key, rather than have to keep adding “=\> true”. So the  
presence of a hash key acts like a switch which i can test with

if options.has\_key? :foo  
do\_extra\_stuff  
end

I thought i’d seen this functionality in rails, where we can pass just a  
hash key without bothering to set it, if we want to switch something on  
or off.
