Что такое твигил в Perl6?

Я читаю это фантастическое введение в Perl6 и наткнулся на довольно интересный термин:

Обратите внимание, что ! twigil означает «это личное для класса».

class ScoreKeeper {
  has %!player-points;
}

Я знаю, что сигилы находятся на Perl5. Но что такое твигил?

Это просто причудливый способ сказать, что перед именем атрибута / переменной есть две сигилы?


person Zaid    schedule 07.01.2016    source источник


Ответы (3)


В проектной документации S02 и S99 говорят о twigil. (Акцент мой).

Обычные сигилы указывают на переменные с нормальной областью видимости, либо лексические, либо с привязкой к пакету. Переменные со странной областью видимости включают вторичный сигил (веточку), который указывает, какой странной области видимости подвержена переменная: [...]

Таким образом, это вторичная сигилла или, скорее, вторая сигилла. Объявление $*foo не означает объявление $foo.

my $*foo = 1;
say $foo;

Это приведет к тому, что переменная '$ foo' не объявлена ​​в ....

person simbabque    schedule 07.01.2016
comment
Я хотел бы добавить, что lizmat на irc.perl.org помог мне понять концепцию. - person simbabque; 07.01.2016

Похоже, это связано с областью видимости переменных:

Твигилы влияют на область видимости переменной ...

Twigil   Scope
------   ----------------------------------------------
none     Based only on declarator
*        Dynamic
!        Attribute (class member)
?        Compile-time variable
.        Method (not really a variable)
<        Index into match object (not really a variable)
^        Self-declared formal positional parameter
:        Self-declared formal named parameter
=        Pod variables
~        The sublanguage seen by the parser at this lexical spot

http://docs.raku.org/language/variables#Twigils

person Adam Taylor    schedule 07.01.2016

Из документации по Twigils:

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

class Point {
    has $.x;
    has $.y;

    method Str() {
        "($!x, $!y)"
    }
}

Обратите внимание, как атрибуты объявлены как $.x и $.y, но по-прежнему доступны через $!x и $!y. Это связано с тем, что в Perl 6 все атрибуты являются частными, и к ним можно получить прямой доступ внутри класса с помощью $!attribute-name. Однако Perl 6 может автоматически генерировать методы доступа для вас. Для получения дополнительных сведений об объектах, классах и их атрибутах см. ориентацию объекта.

Открытые атрибуты имеют . twigil, частные - ! twigil.

class YourClass {
    has $!private;
    has @.public;

    # and with write accessor
    has $.stuff is rw;

    method do_something {
        if self.can('bark') {
            say "Something doggy";
        }
    }
}
person serenesat    schedule 07.01.2016
comment
Вау, их в документации куча! - person Zaid; 07.01.2016