मुझे यह समझने में कठिनाई होती है Scalar
कि धकेलने के बाद धकेलने वाले कंटेनर द्वारा रखा गया मूल्य कब और क्यों प्रभावित होता है। मैं उस समस्या को स्पष्ट करने की कोशिश करूँगा जिसे मैं दो जटिल उदाहरणों में अधिक जटिल संदर्भ में देखता था।
* उदाहरण 1 * पहले उदाहरण में, एक स्केलर $i
को एक सरणी पर एक @b
के भाग के रूप में धकेल दिया जाता है List
। धक्का के बाद, स्केलर द्वारा आयोजित मूल्य को $i++
निर्देश का उपयोग करके लूप के लिए पुनरावृत्तियों में स्पष्ट रूप से अपडेट किया गया है । इन अद्यतनों का सरणी में मान पर प्रभाव पड़ता है @b
: लूप के अंत में, @b[0;0]
के बराबर है 3
और अब नहीं है 2
।
my @b;
my $i=0;
for 1..3 -> $x {
$i++;
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $x == 2 {
@b.push(($i,1));
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @b;
say 'Pushed $i : ', @b[0;0].VAR.WHICH, " ", @b[0;0].VAR.WHERE;
आउटपुट उदाहरण 1:
Loose var $i: Scalar|94884317665520 139900170768608
Loose var $i: Scalar|94884317665520 139900170768648
Pushed $i : Scalar|94884317665520 139900170768648
Loose var $i: Scalar|94884317665520 139900170768688
Post for-loop
Array : [(3 1)]
Pushed $i : Scalar|94884317665520 139900170768688
* उदाहरण 2 * दूसरे उदाहरण में, स्केलर $i
लूप वेरिएबल है। हालांकि यहां तक कि $i
बाद यह धक्का दे दिया गया है (अब परोक्ष बल्कि स्पष्ट रूप से), के मूल्य को अद्यतन किया जाता है $i
में सरणी @c
करता नहीं
धक्का के बाद बदल; यानी लूप के बाद, यह अभी भी है 2
, नहीं 3
।
my @c;
for 1..3 -> $i {
say 'Loose var $i: ', $i.VAR.WHICH, " ", $i.VAR.WHERE;
if $i == 2 {
@c.push(($i,1));
say 'Pushed $i : ', @c[0;0].VAR.WHICH, " ", @c[0;0].VAR.WHERE;
}
}
say "Post for-loop";
say "Array : ", @c;
say 'Pushed $i : ', @c[0;0].VAR.WHICH, " ", @c[0;0].VAR.WHERE;;
आउटपुट उदाहरण 2:
Loose var $i: Scalar|94289037186864 139683885277408
Loose var $i: Scalar|94289037186864 139683885277448
Pushed $i : Scalar|94289037186864 139683885277448
Loose var $i: Scalar|94289037186864 139683885277488
Post for-loop
Array : [(2 1)]
Pushed $i : Scalar|94289037186864 139683885277448
प्रश्न: क्यों है $i
में @b
जबकि, उदाहरण के 1 धक्का के बाद अद्यतन में $i
में @c
उदाहरण 2 में नहीं है?
संपादित करें : @ टिमोटिमो की टिप्पणी के बाद, मैंने .WHERE
उदाहरणों में आउटपुट को शामिल किया । यह (WHICH / तार्किक) स्केलर-पहचान दिखाता है $i
, जबकि इसकी स्मृति पता विभिन्न लूप पुनरावृत्तियों के माध्यम से बदल जाती है। लेकिन यह स्पष्ट नहीं करता है कि उदाहरण 2 में धकेल दिया गया स्केलर एक पुराने पते ("442)" के साथ संयोजन में उसी WHICH-पहचान से बंधा हुआ है।
.WHERE
इसके बजाय उपयोग करते हैं,.WHICH
तो आप देख सकते हैं कि स्केलर वास्तव में लूप के चारों ओर एक अलग वस्तु है। ऐसा इसलिए होता है क्योंकि नुकीले ब्लॉकों को "कॉल" कहा जाता है, और प्रत्येक कॉल पर हस्ताक्षर "बाध्य" होता है।