Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как правильно обратиться к локальной переменной и к параметру, если у них схожее имя? (http://www.flasher.ru/forum/showthread.php?t=193384)

Dip52 26.01.2013 14:43

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

strangedk 26.01.2013 14:47

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

Код AS3:

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


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

Код AS3:

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

Цитата:

Сообщение от strangedk (Сообщение 1117894)
Так делать нельзя, потому что аргументы функции и её локальные переменные находятся в одной области видимости.

Код AS3:

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


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

Код AS3:

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
    }
}


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

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

Код AS3:

                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

Цитата:

Сообщение от strangedk (Сообщение 1117897)
Перечитайте несколько раз, вдумчиво. Пока не поймете.

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

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

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

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

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

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

Добавлено через 1 минуту
Цитата:

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

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

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

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

strangedk 26.01.2013 18:40

Цитата:

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

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


Часовой пояс GMT +4, время: 04:09.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.