2015-12-25 41 views
-1

我正在編寫一個程序來爲語言生成單詞。這裏是我的代碼:字符在函數結束時從字符串中消失

def correct(list) 
    unless @vowel 
     filter_consonants(list) 
     similarity_avoidance(list) 
    end 
    puts "Corrected list: " + list 
    return list 
end 

def similarity_avoidance(list) 
    puts list.size 
    sublist = "" 
    subsublist = "" 
    list.each_char do |character| 
     sublist += character if similarity_exists?(character, @root) 
    end 
    sublist.each_char do |character| 
     subsublist += character if @root.include?(character) 
    end 
    sublist.each_char do |character| 
     sublist.delete!(character) if subsublist.include?(character) 
    end 
    sublist += subsublist 
    list.each_char do |character| 
     list.delete!(character) if sublist.include?(character) 
    end 
    list += sublist 
    puts "Corrected for similarity: " + list 
end 

當字符的字符串是由函數改變,某些字符串中的字符的消失。我不知道我做錯了什麼,或者我是否做錯了。有人知道任何事嗎?

+0

如果你告訴我們什麼輸入你得到了什麼結果並且還包括'similarity_exists?',這將有所幫助。 – ndn

+0

解釋如何使用它,以及樣本輸入和輸出。 – sawa

+0

哦;我設法讓它工作已經。順便提一句,雖然這個程序大多是自動的,我主要注意到吃飯人物的問題,因爲我的程序開始崩潰。和'相似性表達?'?功能並非全部相關;它只是檢查根目錄中是否有類似的輔音。 – MysteryMan23

回答

1

您不更改作爲參數list傳遞到函數中的字符串對象的值。你正在做的是在函數體內爲list分配一個不同的字符串對象。 list不是一個對象,它是對某個對象或另一個對象的引用 - 並且該函數的參數列表中的list與定義在函數外部的list不同。重新命名參數將有助於澄清問題。

您需要做的是將內部價值轉移到外部。在函數中做這件事的機制是return語句。

嘗試從函數中返回(內部)list的新值,並在函數調用時將函數返回值分配給外部list

這同樣的邏輯適用於您嘗試更改list的值的兩個功能。您還需要在filter_consonants的末尾返回list

def correct(list) 
    unless @vowel 
     list = filter_consonants(list) 
     list = similarity_avoidance(list) 
    end 
    puts "Corrected list: " + list 
    return list 
end 

def similarity_avoidance(list) 
    puts list.size 
    sublist = "" 
    subsublist = "" 
    list.each_char do |character| 
     sublist += character if similarity_exists?(character, @root) 
    end 
    sublist.each_char do |character| 
     subsublist += character if @root.include?(character) 
    end 
    sublist.each_char do |character| 
     sublist.delete!(character) if subsublist.include?(character) 
    end 
    sublist += subsublist 
    list.each_char do |character| 
     list.delete!(character) if sublist.include?(character) 
    end 
    list += sublist 
    puts "Corrected for similarity: " + list 
    return list 
end