2

私はハッシュ内の同義語キーと言うでしょう。

複数のキーが同じ値を指すようにしたいので、これらのキーのいずれかを介して値を読み書きできます。

例として、それはそのように動作するはずです (:foo と :bar が同義語であるとしましょう)

hash[:foo] = "foo"
hash[:bar] = "bar"
puts hash[:foo] # => "bar"

更新 1

詳細をいくつか追加させてください。これらのシノニムが必要な主な理由は、制御できない外部ソースからキーを受け取るためですが、実際には複数のキーが同じ値に関連付けられている可能性があるためです。

4

4 に答える 4

9

データ構造を再考する

データへのアクセス方法に応じて、キーまたは値を配列にすることで同義語にすることができます。いずれにせよ、類義語を解析するには、それらが共有する定義語よりも多くの作業を行う必要があります。

定義としてのキー

たとえば、シノニムの定義としてキーを使用できます。

# Create your synonyms.
hash = {}
hash['foo'] = %w[foo bar]
hash
# => {"foo"=>["foo", "bar"]}

# Update the "definition" of your synonyms.
hash['baz'] = hash.delete('foo')
hash
# => {"baz"=>["foo", "bar"]}

定義としての値

この構造を逆にして、キーを同義語の配列にすることもできます。例えば:

hash = {["foo", "bar"]=>"foo"}
hash[hash.rassoc('foo').first] = 'baz'
=> {["foo", "bar"]=>"baz"}
于 2013-04-09T23:48:47.377 に答える
5

hash をサブクラス化し、 and をオーバーライドでき[]ます[]=

class AliasedHash < Hash
  def initialize(*args)
    super
    @aliases = {}
  end

  def alias(from,to)
    @aliases[from] = to
    self
  end

  def [](key)
    super(alias_of(key))
  end

  def []=(key,value)
    super(alias_of(key), value)
  end

  private
  def alias_of(key)
    @aliases.fetch(key,key)
  end
end

ah = AliasedHash.new.alias(:bar,:foo)

ah[:foo] = 123
ah[:bar] # => 123
ah[:bar] = 456
ah[:foo] # => 456
于 2013-04-09T23:24:23.033 に答える
1

元の投稿に対する答えは次のとおりです。

hash[:foo] = hash[:bar]

hash[:foo].__id__ == hash[:bar].__id__it

値が参照値 (String, Array ...) である限り true を保持します。


Update 1に対する答えは次のようになります。

input.reduce({ :k => {}, :v => {} }) { |t, (k, v)| 
        t[:k][t[:v][v] || k] = v;
        t[:v][v] = k;
        t
    }[:k]

ここで、«input» は入力データの抽象的な列挙子 (または配列) であり、[key, value]+、«:k» は結果、«:v» は、次の場合にキーを見つける目的を果たす逆ハッシュです。その値はすでに存在しています。

于 2014-10-17T01:34:51.210 に答える