Переименование объекта File () в JavaScript

Нет, вы не можете. Как следует из другого ответа, вы можете (ab?) Использовать сглаживание изменчивых объектов для достижения аналогичного эффекта. Однако это не то же самое, что ссылки на C ++, и я хочу объяснить, что на самом деле происходит, чтобы избежать каких-либо заблуждений.

Вы видите на C ++ (и других языках) переменную (и поля объекта, и записи в коллекциях и т. д.) - это место хранения, и вы записываете значение (например, целое число, объект или указатель) в это место. В этой модели ссылки являются псевдонимом для места хранения (любого типа) - при назначении переменной без ссылки вы копируете значение (даже если это всего лишь указатель, это все еще значение) для места хранения; когда вы назначаете ссылку, вы копируете в место хранения где-то в другом месте. Обратите внимание, что вы не можете сами изменить ссылку - как только она привязана (и она должна быть как только вы ее создадите), все присваивания к ней изменяют не ссылку, а то, о чем говорится.

В Python (и другие языки), переменная (и поля объекта, и записи в коллекциях и т. д.) - это просто имя. Значения где-то else (например, посыпаны всей кучей), а переменная ссылается (не в смысле ссылок на C ++, скорее как указатель минус арифметика указателя) на значение. Несколько имен могут ссылаться на одно и то же значение (что обычно хорошо). Python (и другие языки) вызывает все, что необходимо, чтобы ссылаться на значение ссылки, несмотря на то, что оно довольно не связано с такими вещами, как ссылки на C ++ и pass-by-reference. Присвоение переменной (или полем объекта или ...) просто означает, что она ссылается на другое значение. Вся модель расположения хранилищ не относится к Python, программист никогда не обрабатывает места хранения для значений. Все, что он хранит и перемешивает, это ссылки на Python, и это не значения в Python, поэтому они не могут быть объектом других ссылок на Python.

Все это не зависит от изменчивости значения - это то же самое для ints и списки, например. Вы не можете взять переменную, которая ссылается и на другую, и перезаписать объект, на который указывает. Вы можете только указать объекту изменить части себя - скажем, изменить содержащуюся в нем ссылку.

Является ли это более ограничительной моделью? Возможно, но это достаточно эффективно в большинстве случаев. И когда это не так, вы можете обойти это, либо с помощью специального класса, подобного приведенному ниже, либо (эквивалентного, но менее очевидного) одноэлементной коллекции.

class Reference:
    def __init__(self, val):
        self._value = val # just refers to val, no copy

    def get(self):
        return self._value

    def set(self, val):
        self._value = val

Это все еще выиграло 't позволяет вам псевдоним «регулярной» переменной или поле объекта, но вы можете иметь несколько переменных, относящихся к одному и тому же объекту Reference (например, для альтернативы mutable-singleton-collection). Вам просто нужно быть осторожным, чтобы всегда использовать .get() / .set() (или [0]).

13
задан CBarr 9 June 2015 в 13:46
поделиться