Feature #2540

Hash#contribute

Added by Makoto Cyross about 2 years ago. Updated 10 months ago.

[ruby-dev:39936]
Status:Closed Start date:12/30/2009
Priority:Normal Due date:
Assignee:- % Done:

0%

Category:core
Target version:1.9.2

Description

初めてチケット切ります。不備がございましたらご指摘ください。

***

現在、Hashにキーと値を設定したいときに、[]=とstoreの2種のメソッドがあります。
しかし、これらのメソッドは更新したselfを返さないため、Hashをマージする(Hash#mergeとは違い、深く検索するマージ)処理を書いたときは、どうしても1行で収まらなくなります

# base:マージするハッシュ
# hash:マージ対象ハッシュ
def merge2(base, hash = {})
  base.each{|key, value| hash[key] = value.kind_of?(Hash) ? merge(value, hash[key].nil? ? {} : hash[key]) : value }
  hash
end

そこで、Hashにキーと値を設定する追加のメソッドとして、Hash#contributeを提案いたします。
機能は、selfを返す以外はHash#storeと同等です。
これを使うときは、injectを使って、1行で済むようになります。

# base:マージするハッシュ
# hash:マージ対象ハッシュ
def merge2(base, hash = {})
  base.keys.inject(hash){|r, key| r.contribute(key, base[key].kind_of?(Hash) ? merge2(base[key], r[key].nil? ? {} : r[key]) : base[key] }
end

ご検討よろしくお願いいたします。

History

Updated by Kazuhiro NISHIYAMA about 2 years ago

> そこで、Hashにキーと値を設定する追加のメソッドとして、Hash#contributeを提案いたします。
> 機能は、selfを返す以外はHash#storeと同等です。

新しいメソッドを追加しなくてもtapを使えば良いと思います。

> これを使うときは、injectを使って、1行で済むようになります。

injectとの組み合わせならeach_with_objectを使う方が良いと思います。

Updated by Makoto Cyross about 2 years ago

> > そこで、Hashにキーと値を設定する追加のメソッドとして、Hash#contributeを提案いたします。
> > 機能は、selfを返す以外はHash#storeと同等です。
> 
> 新しいメソッドを追加しなくてもtapを使えば良いと思います。
> 
> > これを使うときは、injectを使って、1行で済むようになります。
> 
> injectとの組み合わせならeach_with_objectを使う方が良いと思います。

ご意見を反映してみました。

# base:マージするハッシュ
# hash:マージ対象ハッシュ
def merge2(base, hash = {})
  base.each_with_object(hash){|pair, r| r.tap{|tmp| tmp[pair[0]] = pair[1].kind_of?(Hash) ? merge2(pair[1], r[pair[0]].nil? ? {} : r[pair[0]]) : pair[1] }
end

機能的にはこれで十分です。ありがとうございました。

Updated by Yui NARUSE about 2 years ago

  • Status changed from Open to Closed

Also available in: Atom PDF