স্কালার কনস্ট্রাক্টর প্যারামিটারগুলি কি বেসরকারী ভালে ডিফল্ট হয়?


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
@ ওম-নাম-নম: দুঃখিত, আমি এটি পেলাম না। এটিকে আরও পঠনযোগ্য করার জন্য আমার ফর্ম্যাটিং / কাঠামো উন্নত করা উচিত?
টমাসজ নুরকিউইজ

1
@ টমাসনুরকিউইজ: varনন- caseএবং caseক্লাস উভয় ক্ষেত্রে কনস্ট্রাক্টর পরামিতিগুলি (পার্সোনাল) শ্রেণীর বৈশিষ্ট্যগুলিতে রেন্ডার করার জন্য উপলব্ধ এবং অর্থবহ ।
রেন্ডাল শুল্জ 5'13

8
'স্কেলা ফর দ্য bar: Intprivate[this] val bar: Int
ইম্পিশেন্ট

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 ...
হারাবান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.