望着documentation for "===",最後一行顯示,運營商基於。其中和「...所有值類型都必須覆蓋方法WHICH。」這就是爲什麼如果您創建兩個具有相同字符串值的單獨項目,「===」返回True。
my $a = "Hello World";
my $b = join " ", "Hello", "World";
say $a === $b; # True even though different items - because same value
say $a.WHICH ; # "Str|Hello World"
say $b.WHICH ; # (same as above) which is why "===" returns True
因此,而不是創建自己的容器類型或使用一些鉤子的subscripts,你可以直接複製的方式「值類型」做到這一點 - 即屠夫(有些什麼)身份的想法。上面顯示的用於字符串的.WHICH方法只是返回類型名稱和內容,用'|'。爲什麼不做同樣的事情;
class Foo {
has $.bar;
multi method WHICH(Foo:D:) { "Foo|" ~ $!bar.Str }
}
my Foo $a .= new(:bar(1));
my %h{Foo} = $a => 'A', Foo.new(:bar(2)) => 'B';
my Foo $a-prime .= new(:bar(1));
say $a eqv $a-prime; # True
say $a === $a-prime; # True
say %h{$a}; # A
say %h{$a-prime}; # A
有一個小的費用,當然 - 身份的這一類的實例的概念,很好 - 讓我們說有趣。什麼是影響?唯一要緊記的是,如果你打算使用某種對象持久化框架,它將把現在看起來相同的變成一個(可能)的不同實例。
具有相同屬性數據的不同對象將無法區分 - 這就是爲什麼我發佈此答案之前猶豫了。 OTOH,它的課程,它的應用程序,這取決於大小/重要性等,這可能是一個很好的方法來做到這一點。
如何嚴重的是你的應用程序?我有一個答案,在任何生產環境中都是不可接受的,但是如果你只是探索什麼可能是爲了好玩,它可能是有趣的。 – Marty