在大多数情况下,语言不允许操作对基元的引用。例如:有没有一种语言可以操纵原语?
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