在大多數情況下,語言不允許操作對基元的引用。例如:有沒有一種語言可以操縱原語?
var a = 0;
var b = a; // value is copied
b++; // b now represents a new value as this is really b = b + 1; so a != b
雖然非原語的操縱造成這體現在(使用JS)的所有變量(有時是破壞性的)狀態操作:
var a = [];
var b = a; // b is now a reference to the value stored in a.
a.push(1); // b[0] is now 1 -- b and a are pointing to the same thing.
這是非常合情合理的。我完全可以理解爲什麼像String.replace這樣的東西會返回一個值,而不是執行狀態操作。
但是,我想知道,如果沒有任何語言允許原語具有狀態操作。例如:
var a = 0;
var b = a; // b references a
b++; // b and a are now = 1.
我知道在更低級語言的指針,而且幾乎做什麼我說什麼,但我得到它只是重新分配的價值,而不是感覺實際更新參考。
我也知道關於PHP的引用,但由於PHP不允許這樣的事情:
$str = "abcd";
$st[0] = "q"; // this causes an error.
此外,串聯在PHP中的數字的字符串時,的$str .= 'var'
週期被聲稱是創建新的字符串每次迭代。
也許我爲即使是想知道這一點而瘋了,但隨着對象模型作爲變量背景的流行程度的增加,看起來這可能實際上存在(它似乎在某些方面非常複雜,特別是如果您允許被操縱的對象,但它看起來像這樣的語法將是一個很好的學習來源)。
有趣的是,由於意外的(對我來說)結構共享,Python確實讓我感到緊張 - 但我一直試圖壓制細節,所以你必須尋找自己。 – LHMathies 2011-06-15 16:46:33
@LHMathies其實,這是對Python的研究,讓我想到了這一點。 「int」代表一個chached對象使得這個語言能夠工作,但是如果'int'和其他所有東西一樣呢? – cwallenpoole 2011-06-15 17:06:21
'int'(和'string','tuple'等等)**就像**在這方面的其他所有內容。無論類型如何,Python總是使用對所有內容的引用。恰巧一些對象是不可變的。你可以(通過一些努力和醜陋)自己編寫基本上不可變的類,並且在相同抽象級別(以及基本)實現的幾個類是可變的。實際上,Python不是用來作爲對「基元」和「非基元」進行不同處理的例子的語言。 – delnan 2011-06-15 20:12:00