असाइनमेंट ऑपरेटर का उपयोग करते समय "विधि का असोकेंट 'ASSIGN-KEY' एक वस्तु उदाहरण होना चाहिए"


10

टाइप की गई कुंजियों के साथ हैश करें ...

use v6;
class Foo {}
my Hash[Foo, Foo] $MAP;

my $f1 = Foo.new;
my $f2 = Foo.new;

$MAP{$f1} = $f2;

त्रुटि पैदा करता है:

विधि 'इनसोन-कुंजी' का इनवॉइस 'हैश [फू, फू] टाइप का ऑब्जेक्ट उदाहरण होना चाहिए, न कि टाइप का ऑब्जेक्ट' हैश [फू, फू]। ' क्या आप एक '.new' को भूल गए?

मुझे यह भ्रामक लगता है; वास्तविक त्रुटि क्या है और मुझे इसके बजाय क्या लिखना है?

मैंने पहले से ही %हैश वेरिएबल के लिए सतर्कता की कोशिश की , जो काम नहीं करता है, या तो।


यह क्या आप टेलिंग है कि $ MAP एक वर्ग है; OTOMH, मैं कहूंगा कि यह एक भूमिका है। आपको इसे तुरंत करने की आवश्यकता है। लेकिन मुझे जांचने दो।
jjmerelo

जवाबों:


7

जिस तरह से आपने इसे परिभाषित किया है, $MAPवह वास्तव में एक भूमिका है। आपको इसे तुरंत (वास्तव में, दंडित ) करना होगा:

class Foo {}
my Hash[Foo, Foo] $MAP;

my $map = $MAP.new;

my $f1 = Foo.new;
my $f2 = Foo.new;

$map{$f1} = $f2;
say $map;

यहाँ मृत जीव था कि कक्षाएं पैराट्राइज्ड नहीं हो सकती हैं , भूमिकाएं करते हैं।

इसके अलावा:

say $MAP.DEFINITE; # False
say $map.DEFINITE; # True

लेकिन वास्तव में त्रुटि संदेश बहुत जानकारीपूर्ण था, ऊपर और उपयोग करने के लिए सुझाव सहित .new, जैसा कि मैं यहां करता हूं।

हम इसे छोटा कर सकते हैं:

class Foo {}
my %map = Hash[Foo, Foo].new ;
%map{Foo.new} = Foo.new;
%map.say;

परिभाषा से धूर्तता करके, हमें $ MAP मध्यवर्ती वर्ग की आवश्यकता नहीं है।


6

टीएल; डीआर जेजे का जवाब सही है, लेकिन स्पष्टीकरण ने मुझे भ्रमित कर दिया। मैं वर्तमान में आपके द्वारा दिखाई गई समस्या को स्वतः सुधार त्रुटि / बग और / या LTA त्रुटि संदेश के रूप में देखता हूं ।

say my Any       $Any;        # (Any)
say my Hash      $Hash;       # (Hash)
say my Hash[Int] $Hash-Int;   # (Hash[Int])
$Any<a>          = 42;        # OK
$Hash<a>         = 42;        # OK
$Hash-Int.new<a> = 42;        # OK
$Hash-Int<a>     = 42;        # must be an object instance, not a type object

Imo यह एक बग या सुंदर एक के करीब है।

एक बग / समस्या एक ही परिदृश्य में सरणियों के लिए भी लागू होती है:

say my Any       $Any;        # (Any)
say my Array     $Array;      # (Array)
say my Array[Int] $Array-Int; # (Array[Int])
$Any[42]           = 42;      # OK
$Array[42]         = 42;      # OK
$Array-Int.new[42] = 42;      # OK
$Array-Int[42]     = 42;      # Type check failed ... expected Array[Int] but got Array

यदि यह सबसे अच्छा माना जाता है, तो शायद त्रुटि संदेश को बदल दिया जाना चाहिए। जबकि मैं जेजे के साथ सहमत हूं कि त्रुटि संदेश वास्तव में बिंदु पर है (जब आप समझते हैं कि कैसे रकु काम करता है और पता चल रहा है कि क्या चल रहा है), मुझे लगता है कि यह एक एलटीए त्रुटि संदेश है अगर हम आरकेयू (डू) को बदल नहीं सकते हैं।

मनोरंजक हाथ पर, मेरे लिए यह स्पष्ट नहीं है कि कोई त्रुटि संदेश को कैसे बेहतर बना सकता है। और अब हमारे पास यह एसओ है। (है कि में के बारे में मेरी बात सीएफ ... त्रुटि संदेश एलटीए? है में एक हाल ही में इस सवाल का जवाब मैंने लिखा ।)

एक और समाधान

मैंने पहले से ही %हैश वेरिएबल के लिए सतर्कता की कोशिश की , जो काम नहीं करता है, या तो।

जेजे ने एक समाधान प्रदान किया है जो एक स्पष्ट मूल्य के साथ आरंभ करता है .new। लेकिन यह चर से बाधा को गिराता है। इसे बनाए रखने के लिए:

class Foo {}
constant FooFoo = Hash[Foo:D,Foo:D];
my %foo is FooFoo;
%foo{Foo.new} = Foo.new;

आदर्श रूप से constantजरूरत नहीं होगी, और शायद एक दिन यह नहीं होगा, लेकिन मुझे लगता है कि विशेषता पार्सिंग सीमित है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.