Что касается введения в заблуждение: значения FETCH
и STORE
указывают Callables
, что может быть либо method
, либо sub
.
Возвращаясь к вопросу,нет прямого способа сделать это, но есть лучший косвенный способ, который может быть более ясным. Вы можете сделать это, установив сначала multi sub
, а затем передав proto
в качестве параметра:
proto sub store(|) {*}
multi sub store(\self, Int) { say "Int" }
multi sub store(\self, Str) { say "Str" }
my $a := Proxy.new(
FETCH => -> $ { 42 },
STORE => &store,
);
say $a; # 42
$a = 42; # Int
$a = "foo"; # Str
И если вы хотите сделать код короче, но, возможно, менее понятным, вы можетеизбавьтесь от proto
(потому что он будет сгенерирован для вас автоматически) и sub
в multi
(потому что вы можете):
multi store(\self, Int) { say "Int" }
multi store(\self, Str) { say "Str" }
my $a := Proxy.new(
FETCH => -> $ { 42 },
STORE => &store,
);
say $a; # 42
$a = 42; # Int
$a = "foo"; # Str