"অ্যাসাইনমেন্ট অপারেটর ব্যবহার করার সময়" এসসিআইজিএন-কে 'পদ্ধতির অন্তর্ভুক্ত অবশ্যই কোনও অবজেক্ট উদাহরণ হতে হবে "


10

টাইপ করা কী সহ হ্যাশ ...

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

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

$MAP{$f1} = $f2;

ত্রুটি উত্পাদন করে:

পদ্ধতির 'এসএসআইজিএন-কে'-এর চালক অবশ্যই' হ্যাশ [ফু, ফু] 'টাইপের একটি অবজেক্ট উদাহরণ হতে হবে,' হ্যাশ [ফু, ফু] 'টাইপের কোনও ধরণের অবজেক্ট নয়। আপনি কি একটি '.নু' ভুলে গেছেন?

আমি এটি বিভ্রান্তিকর মনে করি; আসল ত্রুটিটি কী এবং এর পরিবর্তে আমার কী লিখতে হবে?

আমি ইতিমধ্যে %হ্যাশ ভেরিয়েবলের জন্য সিগিল চেষ্টা করেছি, এটিও কাজ করে না।


এটি আপনাকে কী বলছে তা হ'ল AP এমএপি একটি শ্রেণি; ওটম, আমি বলব এটি একটি ভূমিকা। আপনার এটি ইনস্ট্যান্ট করা দরকার to তবে আমাকে চেক করতে দাও।
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;

সংজ্ঞা থেকে শোধ করার মাধ্যমে, আমাদের $ এমএপি মধ্যবর্তী শ্রেণির প্রয়োজন নেই।


6

টিএল; ডিআর জেজে-র উত্তরটি সঠিক, তবে ব্যাখ্যাটি আমাকে বিভ্রান্ত করেছিল। আপনি বর্তমানে অটোভিভিফিকেশন ত্রুটি / বাগ এবং / অথবা এলটিএর ত্রুটি বার্তা হিসাবে যে সমস্যাটি দেখিয়েছেন তা আমি বর্তমানে দেখছি

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

ইমো এটি একটি বাগ বা এর খুব কাছাকাছি।

একটি বাগ / সমস্যা একই দৃশ্যে অ্যারেগুলির জন্য প্রযোজ্য:

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

যদি এটি নোটব্যাগ হিসাবে বিবেচনা করা হয় তবে সম্ভবত ত্রুটির বার্তাটি পরিবর্তন করা উচিত। আমি জেজে-র সাথে একমত হয়েছি যে ত্রুটি বার্তাটি আসলে পয়েন্টে রয়েছে (যখন আপনি বুঝতে পারেন যে রাকু কীভাবে কাজ করে এবং কী ঘটছে তা নির্ধারণ করে) তবে আমি মনে করি এটি তবুও যদি আমরা রাকুকে পরিবর্তন না করে তবে এটি একটি এলটিএর ত্রুটি বার্তা।

আঁকড়ে ধরার পক্ষে, এটি ত্রুটি বার্তাকে কীভাবে উন্নত করতে পারে তা আমার কাছে স্পষ্ট নয়। এবং এখন আমরা এই এসও আছে। (যে সম্পর্কে আমার বিন্দু CF ... ত্রুটির বার্তা LTA? Is মধ্যে একটি সাম্প্রতিক উত্তর আমি লিখেছি ।)

আর একটি সমাধান

আমি ইতিমধ্যে %হ্যাশ ভেরিয়েবলের জন্য সিগিল চেষ্টা করেছি, এটিও কাজ করে না।

জেজে এমন একটি সমাধান সরবরাহ করেছে যা একটি স্পষ্ট করে মান সহ আরম্ভ করে .new। কিন্তু এটি পরিবর্তনশীল থেকে সীমাবদ্ধতা হ্রাস করে। এটি ধরে রাখতে:

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

আদর্শভাবে constantএটির প্রয়োজন হবে না, এবং সম্ভবত একদিন এটি হবে না তবে আমি মনে করি বৈশিষ্ট পার্সিং সীমাবদ্ধ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.