स्केल विधि घोषणा में बराबर चिह्न का उपयोग कब करें?


85

बराबरी के चिन्ह के साथ:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
  }
}

बराबरी के संकेत के बिना:

object HelloWorld {
  def main(args: Array[String]) {
    println("Hello!")
  }
}

उपरोक्त दोनों कार्यक्रम एक ही तरीके से निष्पादित होते हैं। ब्लॉग पोस्ट में चीजें जो मुझे स्काला में पसंद नहीं हैं, मैंने पढ़ा कि जब बराबर का चिह्न गायब होता है, तो विधि वापस आ जाएगी Unit(जावा के समान void), इसलिए मान लौटाने वाली विधियों को बराबर चिह्न का उपयोग करना होगा। लेकिन वे विधियाँ जो किसी मान को नहीं लौटाती हैं, वैसे भी लिखी जा सकती हैं।

स्काला विधियों में समान चिह्न का उपयोग करने के लिए सबसे अच्छा अभ्यास क्या है जो एक मूल्य वापस नहीं करता है?

जवाबों:


108

मैं वास्तव में डैनियल के साथ बहुत दृढ़ता से असहमत हूं। मुझे लगता है कि गैर-बराबर वाक्यविन्यास का उपयोग कभी नहीं किया जाना चाहिए । यदि आपका तरीका एपीआई के रूप में सामने आ रहा है और आप गलती से गलत प्रकार से लौटने के बारे में चिंतित हैं, तो एक स्पष्ट प्रकार एनोटेशन जोड़ें:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello!")
    123
  }
}

गैर-बराबर सिंटैक्स छोटा होता है और "क्लीनर" दिख सकता है, लेकिन मुझे लगता है कि यह सिर्फ भ्रम की संभावना को जोड़ता है। मैं कभी-कभी एक समान संकेत जोड़ना भूल गया हूं और मेरा मानना ​​है कि मेरी विधि एक मूल्य वापस कर रही थी जब वास्तव में यह यूनिट लौट रहा था। क्योंकि गैर-बराबर और समान-से-अनुमानित-प्रकार के सिंटैक्स बहुत समान रूप से समान हैं, इसलिए इस समस्या को याद करना आसान है।

भले ही यह मुझे थोड़ा और काम करने की लागत है, मैं स्पष्ट प्रकार के एनोटेशन को पसंद करता हूं जब वे मायने रखते हैं (अर्थात्, उजागर इंटरफेस)।


1
मुझे यह दृष्टिकोण पसंद है, यह अधिक स्पष्ट है और इस प्रकार पाठक के लिए अधिक स्पष्ट है।
लुकाज़ कोरज़ीस्की

4
जाहिरा तौर पर अब यह अनुशंसित शैली है ( docs.scala-lang.org/style/declarations.html#procedure_syntax ) इसलिए मैं इसे स्वीकार किए गए उत्तर को बदल रहा हूं।
एस्को लुओंटोला

1
मैं इस बात से भी सहमत हूँ, मुझे लगता है कि बिना वाक्य रचना = को भाषा से पूरी तरह हटा दिया जाना चाहिए
अहमद सोलिमन फ़रहल

7
मार्टिन ओडस्की ने अपने मुख्य वक्ता "स्काला विद स्टाइल" में कहा कि यह एक ऐतिहासिक गलती थी। उसे इस सिंटैक्स को जोड़ना पड़ा (बिना =) ताकि वह जावा डेवलपर्स से "यूनिट" को छिपा सके ताकि वे भ्रमित न हों। साथ ही उन्होंने उल्लेख किया कि इसे भविष्य में हटा दिया जाएगा।
वर्जित

2
क्या WARN के लिए कोई रास्ता है अगर समान संकेत विधि परिभाषा में भूल गया था? एक संकलक विकल्प के रूप में, उदाहरण के लिए, या किसी भी स्रोत विश्लेषण उपकरण में?
वसीलीनोविकोव

42

अद्यतन: स्केल-2.10 के रूप में, बराबर चिह्न का उपयोग करना पसंद किया जाता है। पुराना उत्तर:

जो तरीके वापस आते हैं, Unitउन्हें हमेशा गैर-बराबर सिंटैक्स का उपयोग करना चाहिए । यह एपीआई में ले जाने के कार्यान्वयन में संभावित गलतियों से बचा जाता है। उदाहरण के लिए, आप गलती से ऐसा कुछ कर सकते हैं:

object HelloWorld {
  def main(args: Array[String]) = {
    println("Hello!")
    123
  }
}

बेशक उदाहरण है, लेकिन आप देख सकते हैं कि यह एक समस्या कैसे हो सकती है। चूँकि अंतिम अभिव्यक्ति वापस नहीं आती है Unit, इसलिए विधि के अलावा अन्य प्रकार का रिटर्न होगा Unit। यह सार्वजनिक एपीआई में उजागर किया गया है, और सड़क के नीचे अन्य समस्याओं का कारण हो सकता है। गैर-बराबर सिंटैक्स के साथ, यह कोई फर्क नहीं पड़ता कि अंतिम अभिव्यक्ति क्या है, स्काला रिटर्न प्रकार को ठीक करता है Unit

यह भी दो अक्षर क्लीनर है। :-) मुझे यह भी लगता है कि गैर-बराबर वाक्यविन्यास कोड को पढ़ने में थोड़ा आसान बनाता है। यह अधिक स्पष्ट है कि प्रश्न में विधि Unitकुछ उपयोगी मूल्य के बजाय वापस आती है ।

संबंधित नोट पर, सार विधियों के लिए एक अनुरूप वाक्यविन्यास है:

trait Foo {
  def bar(s: String)
}

विधि barमें हस्ताक्षर हैं String=>Unit। जब आप किसी सार सदस्य पर एनोटेशन को छोड़ते हैं तो स्केला ऐसा करता है। एक बार फिर, यह क्लीनर है, और (मुझे लगता है) पढ़ना आसान है।


3
समान चिह्न का उपयोग न करना भी स्काला स्टाइल गाइड में सिफारिश है: davetron5000.github.com/scala-style/types/inference/…
Esko Luontola

6
मैंने उस बिट को लिखा है, इसलिए आपको संदर्भ को तौलते समय इसे ध्यान में रखना चाहिए। :-)
डैनियल स्पाइवाक

एलओएल, इसलिए मैंने अपनी प्रेमिका को इस छोटे से आदान-प्रदान का वर्णन किया, सिवाय इसके कि मेरे गरीब के लिए "बिट" "कुतिया" के रूप में सामने आया। कहने की जरूरत नहीं है, कॉमेडी का आगाज हुआ।
साेम

10
स्केलेडेस 2013, मार्टिन ओडस्की, कीनोट - स्काला विद स्टाइल चैप्टर 45 : प्रक्रिया घोषणा (गैर-बराबर वाक्यविन्यास) से बचा जाना चाहिए।
सेनिया

4
आधिकारिक शैली मार्गदर्शिका अब इसकी अनुशंसा नहीं करती है: docs.scala-lang.org/style/declarations.html#procedure_syntax
sbilstein

12

आपको यूनिट्स को वापस करने वाली परिभाषाओं को छोड़कर कॉल घोषणाओं में बराबर चिह्न का उपयोग करना चाहिए

इस बाद वाले मामले में, आप बराबरी के संकेत को छोड़ सकते हैं । यह वाक्यविन्यास पदावनत हो सकता है, हालांकि, यह सबसे अच्छा बचा है। बराबर चिह्न का उपयोग करना और रिटर्न प्रकार घोषित करना हमेशा काम करेगा।


पुस्तकें, मेलिंग सूची, स्रोत कोड। वैसे, उस समय के बाद से यह स्पष्ट हो गया कि बाद के वाक्यविन्यास को हटाए जाने की संभावना नहीं है, और यह कई लोगों द्वारा इष्ट है।
डैनियल सी। सोबरल

1
docs.scala-lang.org/style/types.html#function_values लगता है कि प्रकार शैली गाइड वैसे भी = का उपयोग करके इंगित करता है।
बीपडॉग

4

विधियों के लिए, स्काला स्टाइल गाइड प्रक्रिया सिंटैक्स के विपरीत बराबर सिंटैक्स की सिफारिश करता है

प्रक्रिया सिंटेक्स

प्रक्रिया सिंटैक्स से बचें, क्योंकि यह संक्षिप्तता में बहुत कम लाभ के लिए भ्रमित हो जाता है।

// don't do this
def printBar(bar: Baz) {
  println(bar)
}
// write this instead
def printBar(bar: Bar): Unit = {
  println(bar)
}

0

एक बात: एक विधि के अंतिम कथन की कल्पना करें जिसे यूनिट को वापस करना चाहिए यूनिट को वापस नहीं करता है। गैर-बराबर सिंटैक्स का उपयोग करना तब बहुत सुविधाजनक होता है, मुझे उम्मीद है कि यह नहीं निकाला जाएगा क्योंकि मैं इसके लिए कई उपयोग मामले देखता हूं


0

जैसे-जैसे समय के साथ-साथ डिफ़ॉल्ट शैली में बदलाव आया है, और इसका जवाब देने के लिए कई टिप्पणियों में उल्लेख किया गया है, फ़ंक्शन की घोषणाओं के लिए सिंटैक्स का उपयोग करने के लिए आधिकारिक शैली मार्गदर्शिका में इसकी सिफारिश की गई है =


1
आपके द्वारा प्रदान किया गया लिंक केवल फ़ंक्शंस के बारे में बात करता है, न कि प्रक्रियाएं (यानी फ़ंक्शंस जो यूनिट लौटाती हैं)।
एस्को लुओंटोला

आप ठीक कह रहे हैं, @EskoLuontola, इसके बारे में क्षमा करें, मैंने संभवतः मेरे द्वारा खोले गए कई टैब में से एक गलत लिंक को कॉपी किया है, यह अपडेट हो गया है।
बीपडॉग

0

ऐसी विधि के लिए, जिसका रिटर्न मान नहीं है, ऐसी विधियों को व्यक्त करने का एक तरीका परिणाम प्रकार और समान चिह्न को छोड़ रहा है, इस विधि का पालन घुंघराले ब्रेस में संलग्न ब्लॉक के साथ किया जाता है। इस रूप में, विधि एक प्रक्रिया की तरह दिखती है, एक ऐसा तरीका जो केवल इसके दुष्प्रभावों के लिए निष्पादित किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.