क्या scala कंस्ट्रक्टर पैरामीटर्स प्राइवेट वैल पर डिफॉल्ट करते हैं?


128

मैं कोशिश कर रहा है:

class Foo(bar: Int)

बनाम:

class Foo(private val bar: Int)

और वे ऐसा ही व्यवहार करते प्रतीत होते हैं, हालांकि मैं कहीं भी यह कहते हुए नहीं पाया कि मेरे प्रश्न का (bar: Int)विस्तार (private val bar: Int)है, क्या ये समान / समान हैं?

एक साइड नोट पर, मैं -Xprint:typerइन कोड टुकड़ों पर उपयोग करने की कोशिश कर रहा हूं और वे दूसरे कोड में एक अतिरिक्त लाइन को छोड़कर समान कोड का उत्पादन करते हैं। मैं उस अतिरिक्त पंक्ति को कैसे पढ़ूं?

..
class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val bar: Int = _;
  def <init>(bar: Int): this.Foo = {
    Foo.super.<init>();
    ()
  }
}
..


..
class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val bar: Int = _;
  <stable> <accessor> <paramaccessor> private def bar: Int = Foo.this.bar;
  def <init>(bar: Int): this.Foo = {
    Foo.super.<init>();
    ()
  }
}
..

जवाबों:


177

bar: Int

यह मुश्किल से एक निर्माण पैरामीटर है। यदि इस चर का उपयोग कंस्ट्रक्टर को छोड़कर कहीं भी नहीं किया जाता है, तो यह वहां बना रहता है। कोई फ़ील्ड उत्पन्न नहीं होता है। अन्यथा private val barफ़ील्ड बनाई जाती है और barपैरामीटर का मान उसे सौंपा जाता है। कोई गटर नहीं बनाया जाता है।

private val bar: Int

पैरामीटर की इस तरह की घोषणा private val barनिजी गेटटर के साथ क्षेत्र का निर्माण करेगी । यह व्यवहार किसी भी तरह से ऊपर नहीं है अगर निर्माणकर्ता के बगल में पैरामीटर का उपयोग किया गया था (उदाहरण के लिए toString()या नहीं)।

val bar: Int

ऊपर जैसा ही, लेकिन स्काला जैसा गेटटर सार्वजनिक है

bar: Int मामले कक्षाओं में

जब केस कक्षाएं शामिल होती हैं, तो डिफ़ॉल्ट रूप से प्रत्येक पैरामीटर में valसंशोधक होता है।


15
मामले की कक्षाओं में सभी पैरामीटर "सार्वजनिक" हो जाएंगे val
drexin

6
गोश, मैं समय-समय पर चश्मा पहनता हूं, लेकिन यह बहुत अधिक है।
ओम-नोम-नोम

1
@ om-nom-nom: क्षमा करें, मुझे यह नहीं मिला। क्या मुझे इसे अधिक पठनीय बनाने के लिए प्रारूपण / संरचना में सुधार करना चाहिए?
टॉमाज़ नर्कविक्ज़

1
@TomaszNurkiewicz: varउपलब्ध है और दोनों में गैर ( caseऔर दोनों) वर्ग के गुणों में निर्माण मानकों को प्रस्तुत करने के लिए सार्थक है case
रान्डेल शुल्ज़

8
bar: Intसंकलित की गई पुस्तक 'स्काला फॉर द इम्पाटेंट' मेंprivate[this] val bar: Int
MyTitle

98

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

class Foo(private[this] val bar:Int)

दूसरी ओर, दूसरे मामले barमें एक सामान्य निजी क्षेत्र है, इसलिए यह इस उदाहरण और अन्य उदाहरणों के लिए सुलभ है Foo। उदाहरण के लिए, यह ठीक संकलन करता है:

class Foo(private val bar: Int) {
  def otherBar(f: Foo) {
    println(f.bar) // access bar of another foo
  }
}

और चलाता है:

scala> val a = new Foo(1)
a: Foo = Foo@7a99d0af

scala> a.otherBar(new Foo(3))
3

लेकिन यह नहीं है:

class Foo(bar: Int) {
  def otherBar(f: Foo) {
    println(f.bar) // error! cannot access bar of another foo
  }
}

9
यह स्वीकार किए जाते हैं की तुलना में एक बेहतर जवाब है; यह नंगे bar: Intऔर के बीच के अंतर को उजागर करता है private val ...
हरबन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.