PDA

Просмотр полной версии : Как правильно обратиться к локальной переменной и к параметру, если у них схожее имя?


Dip52
26.01.2013, 14:43
Здравствуйте. :)
Подскажите, пожалуйста. :)
Есть метод-экземпляр, который содержит обязательный параметр 'parametr'.
Я внутри этого метода-экземпляра создаю локальную переменную с таким же именем, как и 'parametr'.
Задаю локальной переменной значение '1'. Когда я вызываю метод-экземпляр, то в качестве аргумента отсылаю '2'.
После этого пишу trace('Значение локальной переменной:',this.parametr,'Значение обязательного параметра:',parametr);. И тут возникает ошибка, будто бы parametr (this.parametr) не найден. Я так понимаю происходит поиск переменной в самом классе?
Заранее большое спасибо. :)

strangedk
26.01.2013, 14:47
Так делать нельзя, потому что аргументы функции и её локальные переменные находятся в одной области видимости.

function someFunction(param:int):void {
var param:int = 0; // так делать нельзя
var newParam:int = param; // а так можно
}


Возможно, вы перепутали с переменной класса, к которой в таких случаях нужно обращаться через this

public class MyClass {
public var myValue:int = 1;

public function MyClass() {
setValue(5);
}

public function setValue(myValue:int):void {
trace(this.myValue); // 1
trace(myValue) // 5
}
}

Dip52
26.01.2013, 14:55
Так делать нельзя, потому что аргументы функции и её локальные переменные находятся в одной области видимости.

function someFunction(param:int):void {
var param:int = 0; // так делать нельзя
var newParam:int = param; // а так можно
}


Возможно, вы перепутали с переменной класса, к которой в таких случаях нужно обращаться через this

public class MyClass {
public var myValue:int = 1;

public function MyClass() {
setValue(5);
}

public function setValue(myValue:int):void {
trace(this.myValue); // 1
trace(myValue) // 5
}
}

Вот цитата с книги Колина Мука.

Обратите внимание, что, как и параметры, локальные переменные могут затенять
переменные и методы экземпляра, чьи имена совпадают с именами локальных
переменных. Локальная переменная также затеняет параметр метода с таким же
именем, фактически переопределяя данный параметр и не оставляя программе
никакого шанса обратиться к нему.

Я совсем не понимаю.

public function doctrine()
{
//Вызываю метод экземпляр с одним обязательным параметров и качестве аргумента отсылаю число 10.
myTested(10);
}
//Определяю метод-экземпляр myTested с модификатором управления доступом private, так как я не буду работать с этим методом-экземпляра в других классах.
//Этому методу-экземпляру присваиваю один обязательный параметр.
private function myTested(localVar)
{
var localVar:Number = 100;
trace(localVar);
}
//100

strangedk
26.01.2013, 15:10
Обратите внимание, что, как и параметры, локальные переменные могут затенять
переменные и методы экземпляра, чьи имена совпадают с именами локальных
переменных. Локальная переменная также затеняет параметр метода с таким же
именем, фактически переопределяя данный параметр и не оставляя программе
никакого шанса обратиться к нему.

Перечитайте несколько раз, вдумчиво. Пока не поймете.

Всё сработало так, как и написано
переменная объявленная внутри функции затеняет ту, которая в параметрах.

Обратиться на самом деле к ней можно, через arguments[0], но это уже ухищрения. Просто запомните что так делать не нужно.

*Я кажется понял, вы не понимаете что значит локальная переменная.
Локальная в вашем случае и есть localVar, а переменная класса это другое

expl
26.01.2013, 16:45
Как правильно обратиться к локальной переменной и к параметру, если у них схожее имя?
Переменную по-другому назвать.
Можно, конечно, магией через arguments, но под это одно предложение подходит:
"Китайские комсомольцы сами себе создают трудности, а потом сами их героически преодолевают"

caseyryan
26.01.2013, 16:53
если у них схожее имя?
Если выражаться точнее, то не схожее, а одинаковое. Если просто схожее, то пофиг, обращаться как обычно, так как схожесть эта только для человека, для программы они будут разными.

п.с. Так лучше вообще не делать никогда.

Dip52
26.01.2013, 18:25
Перечитайте несколько раз, вдумчиво. Пока не поймете.

Всё сработало так, как и написано
переменная объявленная внутри функции затеняет ту, которая в параметрах.

Обратиться на самом деле к ней можно, через arguments[0], но это уже ухищрения. Просто запомните что так делать не нужно.

*Я кажется понял, вы не понимаете что значит локальная переменная.
Локальная в вашем случае и есть localVar, а переменная класса это другое

Тут говорится, что я не смогу обратиться к исходному значению параметра метода по той причине, что у локальной переменной будет тот же идентификатор, который, если он имеет значение, заменит исходное значение параметра на той значение, которое он имеет?

Хорошо, запомню.

Я понимаю, что значит и локальная переменная и переменная класса (экземпляра). То что описывает Колин Мук (обращение к переменной экземпляра с помощью выражения this в том случае, если у параметра метода экземпляра такое же имя) у меня получилось осуществить. Потом попробовал сделать то же самое но только с локальной переменной, не получилось и задал вопрос.

Добавлено через 1 минуту
Если выражаться точнее, то не схожее, а одинаковое. Если просто схожее, то пофиг, обращаться как обычно, так как схожесть эта только для человека, для программы они будут разными.

п.с. Так лучше вообще не делать никогда.

"Схожее" я написал потому, что название темы было слишком длинное.

Хорошо, я не буду делать так.

strangedk
26.01.2013, 18:40
Потом попробовал сделать то же самое но только с локальной переменной, не получилось и задал вопрос.
А то же самое не выйдет.

this это ссылка на самого себя, на экземпляр. Туда достучаться можно из любой вложенности функций, а вот доступ к конкретному scope (области видимости) да еще и с одинаковыми конфликтующими именами - будет получить сложнее.