Perl6 Использование прокси для запуска при доступе к атрибуту - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь реализовать триггер при доступе на запись к атрибуту класса perl6.Я не могу выяснить причину ошибки ...

... Я получил это представление от Как можно написать собственные методы доступа в Perl6?

  1 #!/usr/bin/env perl6
  2 
  3 class MeasureSP {
  4 
  5     has Real $!value;
  6     has Str  $.units;
  7 
  8     submethod BUILD( :$!value, :$!units ) {}
  9 
 10     method value( Real $newval? ) is rw {
 11         return Proxy.new:
 12             FETCH => sub ($)           { $!value },
 13             STORE => sub ($, $newval)  { $!value = $newval },             
 14     }   
 15     
 16 }   
 17 my MeasureSP $m-sp = MeasureSP.new( value => 23, units => 'metres' );
 18 say $m-sp.units;   #metres
 19 say $m-sp.value;   #23
 20 $m-sp.value = 1;   
 21 # Cannot assign to a readonly variable or a value
 22 #in block <unit> at ./retry.p6 line 20

Такое поведение, похоже, изменилось - этот код работал нормально еще 18 июня - но я хочу быть уверенным, что я в ногу с последними идеями.

Любая помощь будет очень признательна!

1 Ответ

0 голосов
/ 31 декабря 2018

Либо удалите return:

method value( Real $newval? ) is rw {
    Proxy.new:
        FETCH => sub ($)           { $!value },
        STORE => sub ($, $newval)  { $!value = $newval },
}

, либо используйте return-rw, если вы действительно хотите быть явным:

method value( Real $newval? ) is rw {
    return-rw Proxy.new:
        FETCH => sub ($)           { $!value },
        STORE => sub ($, $newval)  { $!value = $newval },
}

Проблема в том, что return будет раздеватьуберите любой контейнер с предметами, так что простого помещения is rw в method недостаточно для самого себя.

Относительно того, почему опубликованный код работал, но больше не работает: Rakudo выпускает в последней паремесяцев включало исправление для ошибки, которая означала, что Proxy обрабатывался иначе, чем Scalar в обычной обработке возврата.Proxy не был раздет в местах, где он должен был быть;теперь это надежно.

...