Просмотр полной версии : Как правильно обратиться к локальной переменной и к параметру, если у них схожее имя?
Здравствуйте. :)
Подскажите, пожалуйста. :)
Есть метод-экземпляр, который содержит обязательный параметр '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
}
}
Так делать нельзя, потому что аргументы функции и её локальные переменные находятся в одной области видимости.
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, а переменная класса это другое
Как правильно обратиться к локальной переменной и к параметру, если у них схожее имя?
Переменную по-другому назвать.
Можно, конечно, магией через arguments, но под это одно предложение подходит:
"Китайские комсомольцы сами себе создают трудности, а потом сами их героически преодолевают"
caseyryan
26.01.2013, 16:53
если у них схожее имя?
Если выражаться точнее, то не схожее, а одинаковое. Если просто схожее, то пофиг, обращаться как обычно, так как схожесть эта только для человека, для программы они будут разными.
п.с. Так лучше вообще не делать никогда.
Перечитайте несколько раз, вдумчиво. Пока не поймете.
Всё сработало так, как и написано
переменная объявленная внутри функции затеняет ту, которая в параметрах.
Обратиться на самом деле к ней можно, через arguments[0], но это уже ухищрения. Просто запомните что так делать не нужно.
*Я кажется понял, вы не понимаете что значит локальная переменная.
Локальная в вашем случае и есть localVar, а переменная класса это другое
Тут говорится, что я не смогу обратиться к исходному значению параметра метода по той причине, что у локальной переменной будет тот же идентификатор, который, если он имеет значение, заменит исходное значение параметра на той значение, которое он имеет?
Хорошо, запомню.
Я понимаю, что значит и локальная переменная и переменная класса (экземпляра). То что описывает Колин Мук (обращение к переменной экземпляра с помощью выражения this в том случае, если у параметра метода экземпляра такое же имя) у меня получилось осуществить. Потом попробовал сделать то же самое но только с локальной переменной, не получилось и задал вопрос.
Добавлено через 1 минуту
Если выражаться точнее, то не схожее, а одинаковое. Если просто схожее, то пофиг, обращаться как обычно, так как схожесть эта только для человека, для программы они будут разными.
п.с. Так лучше вообще не делать никогда.
"Схожее" я написал потому, что название темы было слишком длинное.
Хорошо, я не буду делать так.
strangedk
26.01.2013, 18:40
Потом попробовал сделать то же самое но только с локальной переменной, не получилось и задал вопрос.
А то же самое не выйдет.
this это ссылка на самого себя, на экземпляр. Туда достучаться можно из любой вложенности функций, а вот доступ к конкретному scope (области видимости) да еще и с одинаковыми конфликтующими именами - будет получить сложнее.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.