
[code]

    date_hash = {
      :year => 2015,
      :month => 12,
      :day => 15,
    }
    
[/code]

これを`Date.new(date_hash)`みたいな事をして日付オブジェクトを作りたいのですが、  
Rubyらしくかけますか?


CC BY-SA 3.0
2015-12-11T11:46:57.907
19883
2015-12-12T03:06:32.700
9149
question
ruby
rubyでハッシュから日付のオブジェクトを作る方法

[code]

    [19] pry(main)> Date.new(*date_hash.values)
    => #<Date: 2015-12-15 ((2457372j,0s,0n),+0s,2299161j)>
    
[/code]

こんな感じでしょうか？

# 追記 2015-12-12 11:18

`values`は hash の基本的なインスタンスメソッドです。  
検索するとすぐに出てきますので、ご自分でご確認ください。  
[ruby hash values - Google
検索](https://www.google.co.jp/search?q=ruby%20hash#q=ruby+hash+values)

`*` は検索性が低いので、引用します。  
[メソッド呼び出し(super・ブロック付き・yield) (Ruby 2.2.0)](http://docs.ruby-
lang.org/ja/2.2.0/doc/spec=2fcall.html)

> 最後の引数の直前に * がついている場合、その引数の値が展開されて 渡されます。展開はメソッド to_a を経由して行なわれます。つまり:
[code]

>     foo(1,*[2,3,4])
>     foo(1,*[])`
>  
[/code]

>
> は、それぞれ
[code]

>     foo(1,2,3,4)
>     foo(1)
>  
[/code]

>
> と同じです。

つまり、

[code]

    [20] pry(main)> date_hash.values
    => [2015, 12, 15]
    
[/code]

であり、配列のまま渡すとエラーになるので、

[code]

    [24] pry(main)> Date.new([2015, 12, 15])
    NoMethodError: undefined method `<' for [2015, 12, 15]:Array
    from (pry):28:in `new'
    
[/code]

展開して渡しているということです。  
下記2つは同じ意味ですから。

[code]

    [25] pry(main)> Date.new(*[2015, 12, 15])
    [26] pry(main)> Date.new(2015, 12, 15)
    
[/code]

`ruby splat` で検索すると良いかもしれません。

## 補足

tmtms さんのご指摘の通り、`values_at` の方がより頑健になります。  
`values` と `values_at` の違いはお調べになると良いかもしれません。


CC BY-SA 3.0
2015-12-11T11:55:59.640
19884
2015-12-12T03:06:32.700
2015-12-12T03:06:32.700
7471
7471
19883
answer