2017-04-16 38 views
0

私は言語翻訳システムに取り組んでおり、翻訳するフィールドをどのように翻訳するべきかの「マップ」を構築する必要があります。まず、デフォルトのセットを使ってデータ構造を構築する必要があります。私はこのようになりますハッシュを作成する最も簡単な方法を見つけようとしているRubyで二重ネストされたハッシュを構築するにはどうすればよいですか?

fields = [:title, :description] 
languages = [:en, :fr] 

のは、私はこれらの変数があるとしましょう

{ 
    :detection => { 
    :title => { 
     :en => :en, 
     :fr => :fr 
    }, 
    :description => { 
     :en => :en, 
     :fr => :fr 
    } 
    }, 
    # ... other fields 
} 

私は私が行うことができることを知っていますこれはfields変数を繰り返し処理することで、Rubyのzipメソッドを使用して内側のハッシュ値を構築します。しかし、私が知らないのは、これらの2つのフィールドから外側と内側の値を「倍にする」方法があるかどうかです。何か{ :detection => fields.zip(languages.zip(languages)) }(私はこれが正しい方法ではないことを知っていますzipを使用するが、それは私が後のアイデアです)。

繰り返しますが、私はfieldsをループでこれを行うことができますが、私は違っこれを行うことができます場合、私は興味が?

ありがとうございます!ここで


は、それが現在(ループで)実装されています方法は次のとおりです。

def build_default_detection_data 
    fields = [:title, :description] 
    languages = [:en, :fr] 

    default = { 
    detection_map: {}, 
    } 

    fields.each do |field| 
    default[:detection_map][field] = Hash[languages.zip(languages)] 
    end 

    default 
end 

答えて

0

私は質問を理解していないが、ここで私の解釈への答えです。

keys  = [:detection, :abstraction] 
fields = [:title, :description] 
languages = [:en, :fr] 

keys.each_with_object({}) do |key, g| 
    g.update(
    key => fields.each_with_object({}) do |f, h| 
     h[f] = languages.each_with_object({}) { |sym, h| h[sym] = sym } 
    end 
) 
end 

#=> { 
#  :detection => { 
#  :title => { 
#   :en => :en, 
#   :fr => :fr 
#  }, 
#  :description => { 
#   :en => :en, 
#   :fr => :fr 
#  } 
#  }, 
#  :abstraction => { 
#  :title => { 
#   :en => :en, 
#   :fr => :fr 
#  }, 
#  :description => { 
#   :en => :en, 
#   :fr => :fr 
#  } 
#  } 
# } 
+0

@Alex。ずっといい。 –

関連する問題