Ответ 1
Атрибут всегда можно назвать $!foo
в классе. Если вы это сделаете, то код будет сгенерирован для прямого доступа к самому атрибуту, и любые классы, подклассифицирующие ваш класс, не смогут изменить это поведение.
Если вы используете в объявлении класса has $.foo
, это означает, что общедоступный аксессор (и если вы добавите is rw
он также может работать как мутатор).
Когда вы используете $.foo
в своем коде в противном случае, это точно так же, как $( self.foo )
. Это означает, что он вызовет метод foo
on self
и itemize возвращаемое значение (сделайте его одной "вещью", если он еще не был). Это пойдет не так, если вы определили свой атрибут с помощью $!foo
и вы не предоставили method foo
самостоятельно.
Это еще больше: $.bar
действительно означает self.bar
: вам нужно только иметь метод, существующий в bar
имени, который вообще не может быть связан с каким-либо атрибутом.
Если вы определяете частный метод !baz
!
просто указывает на неприкосновенность частной жизни метода, а это означает, что вам нужно называть его действительно как self!baz
. Для этого нет короткого синтаксиса.
Лично мне не нравится тот факт, что вы можете сказать $.zippo
даже если zippo
не является атрибутом. Но я боюсь, что корабль отплыл. Но это поведение вызывает у вас путаницу :-(
Итак, что из-за правила не иметь короткий синтаксис для вызова частного метода? Не уверен, я думаю, действительно, что $!foo
уже был использован для обозначения прямого доступа к атрибуту и предоставить вам ошибку времени компиляции, если атрибут не существует.
Надеюсь, что это ответ на ваш вопрос!