कई भाषाएं अभिव्यक्ति के बजाय कथन बनाने का मार्ग चुनती हैं, जिसमें पायथन भी शामिल है:
foo = 42 # works
if foo = 42: print "hi" # dies
bar(foo = 42) # keyword arg
और गोलंग:
var foo int
foo = 42 # works
if foo = 42 { fmt.Printn("hi") } # dies
अन्य भाषाओं में असाइनमेंट नहीं है, बल्कि स्काइन्ड बाइंडिंग, जैसे OCaml:
let foo = 42 in
if foo = 42 then
print_string "hi"
हालाँकि, let
एक अभिव्यक्ति ही है।
असाइनमेंट की अनुमति देने का लाभ यह है कि हम सशर्त के अंदर किसी फ़ंक्शन के रिटर्न मान की जांच कर सकते हैं, उदाहरण के लिए इस पर्ल स्निपल में:
if (my $result = some_computation()) {
say "We succeeded, and the result is $result";
}
else {
warn "Failed with $result";
}
पर्ल अतिरिक्त रूप से केवल उस सशर्त के लिए घोषणा करता है, जो इसे बहुत उपयोगी बनाता है। यह भी चेतावनी देगा यदि आप एक नया चर घोषित किए बिना एक सशर्त के अंदर असाइन करते हैं - if ($foo = $bar)
चेतावनी if (my $foo = $bar)
देंगे , नहीं करेंगे।
एक और बयान में असाइनमेंट बनाना आमतौर पर पर्याप्त है, लेकिन स्कूपिंग समस्याएं ला सकता है:
my $result = some_computation()
if ($result) {
say "We succeeded, and the result is $result";
}
else {
warn "Failed with $result";
}
# $result is still visible here - eek!
गोलांग त्रुटि जाँच के लिए रिटर्न वैल्यू पर बहुत निर्भर करता है। इसलिए यह एक सशर्त को इनिशियलाइज़ेशन स्टेटमेंट लेने की अनुमति देता है:
if result, err := some_computation(); err != nil {
fmt.Printf("Failed with %d", result)
}
fmt.Printf("We succeeded, and the result is %d\n", result)
अन्य भाषाएं सशर्त के अंदर गैर-बूलियन अभिव्यक्तियों को अस्वीकार करने के लिए एक प्रकार की प्रणाली का उपयोग करती हैं:
int foo;
if (foo = bar()) // Java does not like this
बेशक, एक बूलियन को वापस करने वाले फ़ंक्शन का उपयोग करते समय विफल हो जाता है।
अब हमने आकस्मिक कार्य से बचाव के लिए विभिन्न तंत्र देखे हैं:
- एक अभिव्यक्ति के रूप में असाइनमेंट को अस्वीकार करें
- स्टेटिक टाइप चेकिंग का इस्तेमाल करें
- असाइनमेंट मौजूद नहीं है, हमारे पास केवल
let
बाइंडिंग है
- एक इनिशियलाइज़ेशन स्टेटमेंट की अनुमति दें, अन्यथा असाइनमेंट को अस्वीकार कर दें
- घोषणा के बिना एक सशर्त के अंदर असाइनमेंट को अस्वीकार करें
मैंने उन्हें आरोही वरीयता के क्रम में रैंक किया है - अभिव्यक्ति के अंदर असाइनमेंट उपयोगी हो सकते हैं (और स्पष्ट घोषणा सिंटैक्स, और एक अलग नाम तर्क वाक्यविन्यास होने से पायथन की समस्याओं को दरकिनार करना सरल है)। लेकिन उन्हें खारिज करना ठीक है, क्योंकि एक ही प्रभाव के लिए कई अन्य विकल्प हैं।
बग-मुक्त कोड, terse कोड से अधिक महत्वपूर्ण है।