2012-05-21 56 views
1

我是Vala的新手,但當我嘗試修改函數中的參數變量時,我似乎遇到了一個奇怪的問題。例如,這不起作用:可以修改Vala函數參數變量嗎?

public string changeString(string input) { 
    input = input.down(); 
    return input; 
} 

(我得到這個錯誤:) Invalid assignment from owned expression to unowned variable: input = input.down();

但是這樣做的工作:

public string changeString(string input) { 
    string temp = input; 
    temp = temp.down(); 
    return temp; 
} 

難道我的思維參數變量糾正不了在Vala中修改?如果是這樣,爲什麼?有沒有比上面更好的解決方法?

回答

5

是的,沒有。 Vala中的參數在默認情況下是無主的(如果您不知道這意味着什麼,請參閱https://live.gnome.org/Vala/Tutorial#Ownership)。您可以分配給無主變量(包括參數),但是您只能將無主值分配給無主變量。這裏的問題是string.down的返回值是擁有的,並且你試圖將它分配給一個無主變量。這是不允許的,因爲然後Vala無法知道它是否應該在方法結束時釋放字符串。

有一些解決方法。首先是使擁有的說法:

public string changeString (owned string input) { 
    input = input.down(); 
    return input; 
} 

這通常不是一個好主意,因爲這意味着當你調用changeString瓦拉具有複製(g_strdup)輸入字符串,這是一種浪費。

相關功能是參數方向(請參閱https://live.gnome.org/Vala/Tutorial#Parameter_Directions)。如果要修改的就地輸入,你可以做這樣的事情:

public void changeString (ref string input) { 
    input = input.down(); 
} 

把輸入的拷貝在臨時變量(如你在你的第二個例子一樣)並沒有真正意義...它複製方法第一行中的字符串,然後在下一行覆蓋temp時立即釋放該字符串)。像這樣的東西更有意義:

public string changeString (string input) { 
    string temp = input.down(); 
    return temp; 
} 

當然,你並不真的需要一個臨時變量...

public string changeString (string input) { 
    return input.down(); 
} 
+0

「當然,你並不真的需要一個臨時變量.. 。「 是的,我知道。這只是一個快速示範。我需要做其他的操作。我將通過您發送給我的鏈接並再次進行測試。如果它加起來並在代碼中解決,我可能會選擇你的答案(除非有人寫出了更好的答案,但是你的答案很全面,所以我沒有看到發生這種情況)。謝謝。 :) – weberc2

相關問題