我正在尝试用单词和句子制作一个2D数组,然后制作另一个匹配它的二维数组,但翻译成英文。
以下是我在创建新课程时发生的Lesson模型的回调:
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_content
和lesson.html_content
最终相等?
我期待lesson.parsed_content
成为中国人,lesson.html_content
成为英语,但他们最终都是英语。我可能太累了,但我不明白为什么lesson.parsed_content
也会以英语结束。
答案 0 :(得分: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
外部和内部数组来获得完整的副本,或者你可以使用标准的深度复制方法之一,例如往返{ {3}}。或者完全跳过复制,迭代textarray
,但修改一个单独的数组。