Когда необходимо использовать переменную пакета по сравнению с лексической переменной (и каково различие)?

вы бы сделали это, например, это:

class MyButton : UIButton {

    // ...

    override var isSelected: Bool {
        willSet(newValue) {
            super.isSelected = newValue;
            // do your own business here...
        }
    }

    // ...

}
5
задан romandas 19 June 2009 в 19:17
поделиться

3 ответа

Переменная пакета находится в таблице символов, поэтому, учитывая ее имя, ее можно читать или изменять из любого другого пакета или области действия. Объем лексической переменной определяется текстом программы. Раздел «Частные переменные через my ()» на man-странице perlsub дает более подробную информацию об определении лексических элементов.

Допустим, у нас есть следующий MyModule.pm :

package MyModule;

# these are package variables
our $Name;
$MyModule::calls = "I do not think it means what you think it means.";

# this is a lexical variable
my $calls = 0;

sub say_hello {
  ++$calls;

  print "Hello, $Name!\n";
}

sub num_greetings {
  $calls;
}

1;

Обратите внимание, что он содержит пакет $ calls и лексический $ calls . Любой может получить доступ к первому, но модуль контролирует доступ ко второму:

#! /usr/bin/perl

use warnings;
use strict;

use MyModule;

foreach my $name (qw/ Larry Curly Moe Shemp /) {
  $MyModule::Name = $name;
  MyModule::say_hello;
}

print MyModule::num_greetings, "\n";

print "calls = $MyModule::calls\n";

Результатом программы является

Hello, Larry!
Hello, Curly!
Hello, Moe!
Hello, Shemp!
4
calls = I do not think it means what you think it means.

Как вы можете видеть, переменные пакета являются глобальными, поэтому применимы все обычные ошибки и советы. Если явно не предоставлен доступ, он ' Для кода вне пакета MyModule невозможно получить доступ к своим лексическим $ вызовам .

Практическое правило - вы почти всегда хотите использовать лексические выражения. Perl Best Practices Дамиана Конвея прямо: « Никогда не делайте переменные частью интерфейса модуля » (курсив в оригинале).

8
ответ дан 18 December 2019 в 07:10
поделиться

Переменные пакета - это глобальные переменные; они видны повсюду во всей программе (даже в других модулях). Они полезны, когда вы хотите или нуждаетесь в таком уровне видимости и / или внешнем влиянии. Например, модуль Text :: Wrap использует их, чтобы разрешить единую точку конфигурации для количества столбцов, в которые следует переносить текст. Более того, переменные пакета позволяют вам использовать так называемое «динамическое определение видимости» - но это несколько продвинутая и немного эзотерическая концепция.

Для вашего второго вопроса см. В чем разница между my и our в Perl?

5
ответ дан 18 December 2019 в 07:10
поделиться

Вам следует прочитать Coping with Scoping от MJD. Также было бы полезно прочитать

perldoc perlmod .

Код не из этого мира уродлив. . Он попирает всевозможные пространства имен, не беспокоясь о мире только потому, что автор, кажется, думает, что $ author :: email - это круто.

Лучшим способом было бы использовать хеш:

my %author = (
   email => 'author@example.com',
   ...
);

Попирать весь символ в таблице нет необходимости.

У меня есть несколько примеров Win32 :: OLE : http://www.unur.com/comp/ , которые не являются произведениями искусства, но Я считаю, что это улучшения в этом стиле. См. Также Почему количество страниц в документе Word отличается в Perl и Word VBA?

Я собираюсь немного разглагольствовать :

@pgm::runtime_args = @ARGV ;

Итак, мы отказываемся от стандартного массива @ARGV и попираем пространство имен pgm . Более того, каждый программист на Perl знает, что такое @ARGV . В любом случае @pgm :: runtime_args больше не используется в сценарии.

$pgm::maxargs = $#pgm::runtime_args + 1 ;

Конечно, @pgm :: runtime_args в скалярном контексте даст нам количество элементов в этот массив. Я понятия не имею, зачем может понадобиться $ pgm :: maxargs , но если бы это было так, то эта строка должна была бы быть:

$pgm::maxargs = @pgm::runtime_args;

Я не буду цитировать больше этого материала. Полагаю, именно это происходит, когда программисты на Cobol пытаются написать Perl.

$program::copyright = "Copyright (c) 02002 - Kenneth Tomiak : All rights reserved.";

Я рад, что он выделил пять цифр на год. Никогда не знаешь!

PS: Я считаю, что мои выдержки представляют собой добросовестное использование.

runtime_args больше не используется в скрипте.

$pgm::maxargs = $#pgm::runtime_args + 1 ;

Конечно, @pgm :: runtime_args в скалярном контексте даст нам количество элементов в этом массиве. Я понятия не имею, зачем может понадобиться $ pgm :: maxargs , но если бы это было так, то эта строка должна была бы быть:

$pgm::maxargs = @pgm::runtime_args;

Я не буду цитировать больше этого материала. Полагаю, именно это происходит, когда программисты на Cobol пытаются написать Perl.

$program::copyright = "Copyright (c) 02002 - Kenneth Tomiak : All rights reserved.";

Я рад, что он выделил пять цифр на год. Никогда не знаешь!

PS: Я считаю, что мои выдержки представляют собой добросовестное использование.

runtime_args больше не используется в скрипте.

$pgm::maxargs = $#pgm::runtime_args + 1 ;

Конечно, @pgm :: runtime_args в скалярном контексте даст нам количество элементов в этом массиве. Я понятия не имею, зачем может понадобиться $ pgm :: maxargs , но если бы это было так, то эта строка должна была бы быть:

$pgm::maxargs = @pgm::runtime_args;

Я не буду цитировать больше этого материала. Полагаю, именно это происходит, когда программисты на Cobol пытаются написать Perl.

$program::copyright = "Copyright (c) 02002 - Kenneth Tomiak : All rights reserved.";

Я рад, что он выделил пять цифр на год. Никогда не знаешь!

PS: Я считаю, что мои выдержки представляют собой добросовестное использование.

$pgm::maxargs = @pgm::runtime_args;

Я не буду больше цитировать это. Полагаю, именно это происходит, когда программисты на Cobol пытаются написать Perl.

$program::copyright = "Copyright (c) 02002 - Kenneth Tomiak : All rights reserved.";

Я рад, что он выделил пять цифр на год. Никогда не знаешь!

PS: Я считаю, что мои выдержки представляют собой добросовестное использование.

$pgm::maxargs = @pgm::runtime_args;

Я не буду больше цитировать это. Полагаю, именно это происходит, когда программисты на Cobol пытаются написать Perl.

$program::copyright = "Copyright (c) 02002 - Kenneth Tomiak : All rights reserved.";

Я рад, что он выделил пять цифр на год. Никогда не знаешь!

PS: Я считаю, что мои выдержки представляют собой добросовестное использование.

9
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: