2012-12-27 89 views
0

我想用單詞和句子製作一個二維數組,然後再製作一個與之匹配的二維數組,但翻譯成英文。爲什麼這兩個變量結果相同?

這裏是當我創建一個新的教訓出現這種情況的課程模式回調:

before_create do |lesson| 
    require 'rmmseg' 
    require "to_lang" 
    require "bing_translator" 

    lesson.parsed_content =[] 
    lesson.html_content = [] 
    RMMSeg::Dictionary.load_dictionaries 

    text = lesson.content 
    text = text.gsub("。","^^.") 
    text = text.gsub("?","~~?") 
    text = text.gsub("!", "||!") 

    text = text.split(/[.?!]/u) #convert to an array 
    text.each do |s| 
    s.gsub!("^^","。") 
    s.gsub!("~~","?") 
    s.gsub!("||","!") 
    end 

    text.each_with_index do |val, index| 
    algor = RMMSeg::Algorithm.new(text[index]) 
    splittext = [] 
    loop do 
     tok = algor.next_token 
     break if tok.nil? 
     tex = tok.text.force_encoding('UTF-8') 
     splittext << tex 
     text[index] = splittext 
    end 
    end 

    lesson.parsed_content = text 
    textarray = text 
    translator = BingTranslator.new(BING_CLIENT_ID, BING_API_KEY) 
    ToLang.start(GOOGLE_TRANSLATE_API) 
    textarray.each_with_index do |sentence, si| #iterate array of sentence 
    textarray[si] = [] 
    sentence.each_with_index do |word,wi| #iterate sentence's array of words 
     entry = DictionaryEntry.find_by_simplified(word) #returns a DictionaryEntry object hash 
     if entry == nil #for cases where there is no DictionaryEntry 
     textarray[si] << word 
     else 
     textarray[si] << entry.definition 
     end 
    end 
    lesson.html_content = textarray 
    end 
end 

爲什麼我的變量lesson.parsed_contentlesson.html_content結束了彼此相等?

我期待lesson.parsed_content是中文,lesson.html_content是英文,但最終都是英文。我可能太累了,但我不明白爲什麼lesson.parsed_content也會結束英語。

回答

4

你引用同一陣列中兩者:

lesson.parsed_content = text 
textarray = text 
# Various in-place modifications of textarray... 
lesson.html_content = textarray 

只是做lesson.parsed_content = text不重複text,它只是副本,這樣您最終的四件事在同一塊指向的參考數據:

text ------------------=-+--+--+----> [ ... ] 
lesson.parsed_content -=-/ | | 
lesson.html_content ---=----/ | 
textarray -------------=-------/ 

每個賦值只是將另一個指針添加到相同的基礎數組。

你不能用簡單的lesson.parsed_content = text.dup修復這個問題,因爲dup只能做一個淺拷貝,並且不會複製內部數組。既然你知道你有一個數組的陣列,你可以用dup這個外部和內部數組來獲得一個完整的副本,或者你可以使用標準的深度複製方法之一,例如通過Marshal的往返。或者完全跳過複製,遍歷textarray,但修改單獨的數組。

+0

謝謝。那工作。我每天從字面上學習新東西。 – webmagnets

相關問題