2016-10-04 14 views
-1

ハッシュの中にたくさんの要素を格納したいが、その時のキーはキーでなければならない。このようなことをどうやってやりますか?これは純粋なRubyではなくRailsにあります。これを実行する1つの方法をだruby​​で(タイムスタンプを使用して)履歴を使ってキー値を格納する方法は?

+2

'store || = {}; store [Time.zone.now.to_i] = 'some info'' –

+0

'Time#zone'は' String'([link](http://ruby-doc.org/core-2.3.1/Time)を返します。 html#method-i-zone))ので、 'now'を適用することはできません。あなたは 'Time.now.to_i'を行うことができますが、これは1秒単位しか提供しません。 OPはタイムスタンプに必要な細分性を指定する必要があります。 – user1934428

+1

'Time.now.to'が整数を返し、' to_f'を呼び出すのが無意味なので、粒度 – Tiago

答えて

2

class Store 
    def initialize() 
     @hash = {} 
    end 

    def add(data) 
     @hash[Time.now.to_f] = data 
    end 

    def to_s 
     @hash.to_s 
    end 

end 


new_store = Store.new 

new_store.add("foo"); 
new_store.add("bar"); 

puts new_store.to_s 

出力:

{1475565786.995899=>"foo", 1475565786.995907=>"bar"} 
1
hash = (Class.new(Hash) do 
    def << value 
    tap { |this| this[Time.now.strftime("%Y-%m-%d %H:%M:%S.%6N")] = value } 
    end 
end).new 
hash << :foo 
sleep 1 
hash << :bar << :baz 
hash 
#⇒ { 
# "2016-10-04 09:44:08.816475" => :foo, 
# "2016-10-04 09:44:09.824107" => :bar, 
# "2016-10-04 09:44:09.824125" => :baz 
# } 

NB:私はには力を入れていないため、質問をdownvotedが、このソリューションので、それを答え将来の訪問者に役立つかもしれません。

+0

非常に良い解決策です。ちょうど簡単な質問: 'self [Time.now] = value'は' self.tap'よりも何とか悪いですか? –

+0

@AndreyDeineko 'hash <<:bar <<:baz'を参照してください:' <<'コールを連鎖させるにはこのメソッドは 'self'を返します。 – mudasobwa

+0

絶対に、それについてこのように考えなかった –

関連する問題