Forum: Ruby Passing a hash of args

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
9d4ec8946f933a18a1d15b094cc3c425?d=identicon&s=25 Jonathan Leighton (Guest)
on 2006-01-08 23:57
(Received via mailing list)
Is there a way to pass each item is a hash as a successive argument to a
function?

ie:

time = {
  :year => 2003
  :month => 03
  :day => 24
}
Time.local(time)

(that wouldn't work but you get the idea)

Cheers
Cee0292fffa691f1fb320d5400200e99?d=identicon&s=25 Marcel Molina Jr. (Guest)
on 2006-01-09 00:00
(Received via mailing list)
On Mon, Jan 09, 2006 at 07:55:42AM +0900, Jonathan Leighton wrote:
> Time.local(time)
>
> (that wouldn't work but you get the idea)

Hashes aren't ordered. Otherwise you could just do
Time.local(*time.values).

Time.local(*[:year, :month, :day].map {|key| time[key]}) is DRYer but
more
typing than Time.local(time[:year], time[:month], time[:day])

I look forward to someone else coming up with something clever.

marcel
9358cc96c46055cd68d4a76a9aefe026?d=identicon&s=25 Daniel Harple (Guest)
on 2006-01-09 00:03
(Received via mailing list)
Jonathan Leighton wrote:

> }
>
>

Time.local(*time.values.reverse)

-- Daniel
4299e35bacef054df40583da2d51edea?d=identicon&s=25 James Gray (bbazzarrakk)
on 2006-01-09 00:03
(Received via mailing list)
On Jan 8, 2006, at 4:55 PM, Jonathan Leighton wrote:

> }
> Time.local(time)

Well, Hashes are unordered by definition, but as long as we declare
an order it's doable:

 >> time = {
?>   :year => 2003,
?>   :month => 03,
?>   :day => 24
 >> }
=> {:month=>3, :year=>2003, :day=>24}
 >> Time.local(*time.values_at(:year, :month, :day))
=> Mon Mar 24 00:00:00 CST 2003

Hope that helps.

James Edward Gray II
82e62c756d89bc6fa0a0a2d7f2b1e617?d=identicon&s=25 Ross Bamford (Guest)
on 2006-01-09 00:18
(Received via mailing list)
On Sun, 08 Jan 2006 23:00:42 -0000, Daniel Harple
<dharple@generalconsumption.org> wrote:

>>   :day => 24
>> }
>> Time.local(time)
>>
>> (that wouldn't work but you get the idea)
>>
>
> Time.local(*time.values.reverse)
>

Pretty sure that'd only work with some hashes, and only if you had less
than a bucketful of entries?

Cheers,
9358cc96c46055cd68d4a76a9aefe026?d=identicon&s=25 Daniel Harple (Guest)
on 2006-01-09 00:36
(Received via mailing list)
On Jan 9, 2006, at 12:18 AM, Ross Bamford wrote:

>
Yes, my mistake. (too late to be thinking here...)

James's suggestion seems to be the best.

-- Daniel
9d4ec8946f933a18a1d15b094cc3c425?d=identicon&s=25 Jonathan Leighton (Guest)
on 2006-01-09 01:07
(Received via mailing list)
On Mon, 2006-01-09 at 08:01 +0900, James Edward Gray II wrote:
> => Mon Mar 24 00:00:00 CST 2003
Cool. Thanks everyone. I didn't realise you could do *myvar when calling
a method as well as when defining them. I was basically looking for a
way to do the following (which I've managed to solve without use of a
hash):

class Time
  UNITS = [ :year, :month, :day, :hour, :min, :sec, :usec ]

  def to_precision(unit)
    args = []
    0.upto(UNITS.index(unit)) { |unit| args <<
method(UNITS[unit]).call }
    Time.local(*args)
  end
end

Is that a sensible way to do it?

Cheers
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 unknown (Guest)
on 2006-01-09 02:28
(Received via mailing list)
Hi --

On Mon, 9 Jan 2006, Jonathan Leighton wrote:

>> >> Time.local(*time.values_at(:year, :month, :day))
>  def to_precision(unit)
>    args = []
>    0.upto(UNITS.index(unit)) { |unit| args <<
> method(UNITS[unit]).call }
>    Time.local(*args)
>  end
> end
>
> Is that a sensible way to do it?

I would do:

   send(UNITS[unit])

in preference to the method/call thing.  Maybe:

   args = (0..UNITS.index(unit)).map { |unit| send(UNITS[unit]) }


David


--
David A. Black
dblack@wobblini.net

"Ruby for Rails", from Manning Publications, coming April 2006!
http://www.manning.com/books/black
9d4ec8946f933a18a1d15b094cc3c425?d=identicon&s=25 Jonathan Leighton (Guest)
on 2006-01-09 18:25
(Received via mailing list)
On Mon, 2006-01-09 at 10:26 +0900, dblack@wobblini.net wrote:
> >
> > Is that a sensible way to do it?
>
> I would do:
>
>    send(UNITS[unit])
>
> in preference to the method/call thing.  Maybe:
>
>    args = (0..UNITS.index(unit)).map { |unit| send(UNITS[unit]) }

Awesome, thanks. I did feel the method/call bit was slightly ugly.

Cheers
This topic is locked and can not be replied to.