मैं निल पर किसी भी विधि को कॉल कर सकता हूं और यह गलत लगता है


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डाउन मेथड कॉल चेन का प्रचार होता है। इसी तरह Nilरिटर्न पर किसी भी सबस्क्रिप्टिंग ऑपरेशन Nil", इसलिए आशय हर कदम पर $foo.Bar()[0].Baz()चेक की आवश्यकता के बिना अभिव्यक्ति की अनुमति देता प्रतीत होता है Nil, या विशेष "नील-सुरक्षित। "विधि कॉल और सबस्क्रिप्टिंग ऑपरेटर।


4
वास्तव में। और काफी समय पहले से ही पहले से ही: github.com/rakudo/rakudo/commit/174727377f (दिसंबर 2013) संबंधित अटकलें भी देखें: design.raku.org/S02.html#Nil
एलिजाबेथ मैटर्सबोन

1
@ एलिज़बेथमाटीजसेन आह, मुझे लगता है कि S02 का जवाब है। "कोई भी अपरिभाषित विधि Nilरिटर्न पर कॉल करती है Nil, ताकि Nilविधि कॉल चेन को प्रचारित किया जा सके।" तो यह इरादा है कि आप $foo.Bar().Baz().Blah()हर चरण या एक विशेष ?.प्रकार के ऑपरेटर (जब तक आप सही ढंग से अंत में शून्य को संभालते हैं) पर नील परीक्षणों की आवश्यकता के बिना कर सकते हैं । मैं उसे संपादित करूंगा, धन्यवाद।
हॉब्स

1
A Nilजो त्रुटि नहीं करता है और बस वापस फेंकता है, उसे NilObj-C और NS फ्रेमवर्क में काफी व्यापक उपयोग मिलता है, जहाँ इसका समान तरीके से उपयोग किया जाता है - जो निल पर गुजरने वाली जंजीर कॉल की अनुमति देता है। मुझे अपवादों के सटीक प्रदर्शन के दंड और उन्हें पकड़ने का पता नहीं है, लेकिन मेरा अनुमान है कि Nilकम लचीले होने पर जंजीर अधिक कुशल हो सकती है।
user0721090601

1
(लेकिन यह एक पूरी तरह से असंवेदनशील अनुमान है, इसलिए मैं छिपकली या jnthn के लिए खुश हूं कि मुझे बताएं कि मैं गलत हूं और मुझे :-) बंद करने की आवश्यकता है)
user0721090601

2
Nilवर्ग एक है FALLBACK docs.raku.org/language/typesystem#index-entry-FALLBACK_(method) विधि है, जो रिटर्न Nil। असल में, एक अपवाद से पहले फेंक दिया जाता है क्योंकि एक विधि नहीं मिल सकती है, के लिए एक जांच की FALLBACKजाती है, और यदि उपलब्ध हो तो बुलाया जाता है।
एलिजाबेथ मैटीजसेन

5

इस सवाल (और हॉब्स के जवाब) ने भी मुझे महसूस किया ... बेचैनी: मैंने अंततः https://docs.raku.org/language/traps पाया : यह बताता है कि असाइन करना Nilएक अलग मूल्य, आमतौर पर पैदा करता है Any। निम्नलिखित मूल REPL बातचीत यह भी दर्शाती है:

> 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 )

... इसलिए सामान्य विचार यह है कि 'अनुपस्थित मूल्य या सौम्य विफलता' नियमित कोड में मेरी (और शायद आप भी?) की तुलना में कम व्यापक है, अचानक डर गया: यह तब होता है, जब आप regex के साथ काम करने जा रहे हैं? सीधे और आपकी विशेष आकस्मिक स्थिति से सीधे मेल खाते तरीकों से संबंधित है $!

यह मुझे और अधिक के बीच अंतर के बारे में अवगत कराया Nilऔर Any, और प्रदान की औचित्य मेरे लिए और अधिक समझ में बनाया है।


2
Nilअपनी डिफ़ॉल्ट स्थिति में एक कंटेनर सेट करता है। आप डिफ़ॉल्ट मान बदल सकते हैं। my $foo is default(42) = 5; $foo = Nil; say $foo; # 42
ब्रैड गिल्बर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.