আমি নীলকে কোনও পদ্ধতি কল করতে পারি এবং এটি ভুল অনুভব করে


14

আমি সম্প্রতি একটি স্ক্রিপ্ট ডিবাগ করার জন্য যথেষ্ট সময় ব্যয় করেছি এবং অবশেষে যখন আমি সমস্যাটি দেখতে পেলাম তখন কোডটির কারণ হ'ল এটির মতো দেখাচ্ছিল:

class Foo {
    has $.bar;
    method () {
        # do stuff
        $!.bar;
    }
}

দেখা গেল সমস্যাটি ছিল সমস্যাটি $!.bar, যা হয় $!barবা হওয়া উচিত ছিল $.bar। বুঝতে পেরেছি.

তবে কেন এই মারা যায় না ?

আরো বিস্তারিত এই সময়ে খুঁজছি, তা এখানে ইস্যু মত দেখায় যে, আমি একজন (অবর্তমান) মেথড কল করার চেষ্টা করছি হয় barউপর $!, যা এই সময়ে হয় Nilকারণ সেখানে কোনো ত্রুটি হয়ে নি।

আর মনে হচ্ছে আমি আসলে কোন পদ্ধতি আমি চাই কল করতে পারেন Nilএবং তারা সব চুপটি প্রত্যাবর্তন Nil, ভালো জিনিস সহ Nil.this-is-a-fake-methodএবং Nil.reverse-entropy(123)

এটি কি একটি বৈশিষ্ট্য? যদি তাই হয়, যুক্তি কি?

উত্তর:


13

এটি উদ্দেশ্য এবং নথিভুক্ত, হ্যাঁ। এর শিরোনামটি Nilহ'ল "একটি মানের উপস্থিতি বা সৌম্য ব্যর্থতা" এবং শ্রেণি নথির উল্লেখ রয়েছে

যে পদ্ধতির Nilঅস্তিত্ব নেই তার কল করার যে কোনও পদ্ধতি কল রয়েছে এবং ফলস্বরূপ, কোনও সাবস্ক্রিপশন অপারেশন সফল হবে এবং ফিরে আসবে Nil

say Nil.ITotallyJustMadeThisUp;  # OUTPUT: «Nil␤» 
say (Nil)[100];                  # OUTPUT: «Nil␤» 
say (Nil){100};                  # OUTPUT: «Nil␤»

সংক্ষিপ্তসার 2 এ বলা হয়েছে " Nilরিটার্নের ক্ষেত্রে কোনও অপরিজ্ঞাত পদ্ধতি কল Nil, যাতে Nilপদ্ধতি কল চেইনগুলি ডাউন করে দেয় Like একইভাবে কোনও Nilরিটার্নে সাবস্ক্রিপশন অপারেশন Nil", সুতরাং অভিপ্রায়টি প্রতিটি পদক্ষেপে $foo.Bar()[0].Baz()চেকের প্রয়োজন ছাড়াই অভিব্যক্তিগুলিকে অনুমতি দেবে বলে মনে হচ্ছে Nilবা বিশেষ "নীল-নিরাপদ" "পদ্ধতি কল এবং সাবস্ক্রিপিং অপারেটরগুলি।


4
প্রকৃতপক্ষে. এবং বেশ দীর্ঘদিন আগে ইতিমধ্যে এটিও : github.com/rakudo/rakudo/commit/174727377f (ডিসেম্বর 2013) এছাড়াও সম্পর্কিত অনুমান দেখুন: ডিজাইন.রাক.আর.গো.এস.এস.টি.এইচটিএমএল# নীল
এলিজাবেথ ম্যাটিজসেন

1
এলিজাবেথমাত্তিজেন আহ, আমি মনে করি এস 0 এর উত্তর আছে। " Nilরিটার্নে Nilযে কোনও অপরিবর্তিত পদ্ধতি কল , যাতে Nilপদ্ধতি কল চেইনগুলি প্রচার করে" " সুতরাং এটির উদ্দেশ্য যে আপনি $foo.Bar().Baz().Blah()প্রতিটি পদক্ষেপে বা কোনও বিশেষ ?.ধরণের অপারেটরের শূন্য পরীক্ষার প্রয়োজন ছাড়াই এটি করতে পারেন (যতক্ষণ না আপনি সঠিকভাবে শেষের দিকে শোনো)। আমি এটি সম্পাদনা করব, আপনাকে ধন্যবাদ।
hobbs

1
একটি Nilযা ত্রুটি করে না এবং কেবল আরও পিছনে ফেলে দেয় Nilসেগুলি ওবজে-সি এবং এনএস ফ্রেমওয়ার্কগুলিতে যেখানে এটি একইভাবে ব্যবহৃত হয় - সেখানে শিকলযুক্ত কলগুলির জন্য মঞ্জুরি দেয় যা নীলকে অতিক্রম করে। আমি ব্যতিক্রম এবং সেগুলি ধরার সঠিক পারফরম্যান্সের জরিমানাগুলি জানি না, তবে আমার অনুমান যে Nilশৃঙ্খলাটি কম নমনীয় হলে আরও কার্যকর হতে পারে।
user0721090601

1
(তবে এটি সম্পূর্ণ অজ্ঞাত অনুমান, সুতরাং আমি লিজম্যাট বা জান্তনের জন্য খুশি যে আমাকে বলার জন্য আমি ভুল এবং আমার চুপ করে থাকা দরকার :-))
ইউজার 0721090601

2
Nilবর্গ একটি আছে FALLBACK docs.raku.org/language/typesystem#index-entry-FALLBACK_(method) পদ্ধতি, যা আয় Nil। মূলত, একটি ব্যতিক্রম ছোঁড়ার ঠিক আগে কারণ কোনও পদ্ধতি খুঁজে পাওয়া যায়নি, তার জন্য একটি চেক FALLBACKকরা হয়েছে, এবং যদি পাওয়া যায় তবে তাকে ডাকা হয়।
এলিজাবেথ ম্যাটিজসেন

5

এই প্রশ্নের (এবং শখের উত্তর) আমাকেও বোধ করেছিল ... অস্বস্তিকর: অবশেষে আমি https://docs.raku.org/language/traps খুঁজে পেয়েছি : এটি ব্যাখ্যা করে যে Nilসাধারণত নির্ধারণ করা একটি আলাদা মান উত্পন্ন করে Any। নিম্নলিখিত মৌলিক আরপিএল ইন্টারঅ্যাকশনটি এটিও প্রদর্শন করে:

> my $foo = Nil
(Any)

> $foo.bar
No such method 'bar' for invocant of type 'Any'
  in block <unit> at <unknown file> line 1

> my $bar := Nil
Nil

> $bar.baz
Nil

((মধ্যে পার্থক্য =এবং :=এখানে আচ্ছাদিত হয়: https://docs.raku.org/language/containers#Binding ))

... সুতরাং সাধারণ ধারণাটি হ'ল 'অনুপস্থিত মান বা সৌম্য ব্যর্থতা' আমার তুলনায় নিয়মিত কোডে খুব কম বিস্তৃত হয় (এবং সম্ভবত আপনিও?) হঠাৎ ভয় পেয়েছিল: এটি তখনই ঘটে যখন আপনি রেজেক্সের সাথে কাজ করতে যাচ্ছেন it সরাসরি অনুরোধ পদ্ধতিগুলির সাথে সম্পর্কিত এবং আপনার নির্দিষ্ট দুর্ঘটনাজনিত পরিস্থিতিতে সরাসরি মেলে $!

এটি আমাকে Nilএবং এর মধ্যে পার্থক্য সম্পর্কে আরও সচেতন করে তুলেছে Anyএবং প্রদত্ত যুক্তি আমার কাছে আরও তাত্পর্যপূর্ণ হয়েছিল।


2
Nilতার ডিফল্ট অবস্থায় একটি ধারক সেট করে। আপনি ডিফল্ট মান পরিবর্তন করতে পারেন। my $foo is default(42) = 5; $foo = Nil; say $foo; # 42
ব্র্যাড গিলবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.