প্যাকেজ অবজেক্টস


92

প্যাকেজ অবজেক্টগুলি কী, এত বেশি ধারণা নয় তবে তাদের ব্যবহার?

আমি কাজ করে একটি উদাহরণ পাওয়ার চেষ্টা করেছি এবং কাজ করার একমাত্র ফর্মটি নিম্নরূপ:

package object investigations {
    val PackageObjectVal = "A package object val"
}

package investigations {

    object PackageObjectTest {
        def main(args: Array[String]) {
            println("Referencing a package object val: " + PackageObjectVal)
        }
    }
}

আমি এখনও অবধি পর্যবেক্ষণগুলি হ'ল:

package object _root_ { ... }

অনুমোদিত নয় (যা যুক্তিসঙ্গত),

package object x.y { ... }

এছাড়াও অনুমোদিত নয়।

দেখে মনে হচ্ছে কোনও প্যাকেজ অবজেক্টকে তাত্ক্ষণিক প্যারেন্ট প্যাকেজে ঘোষণা করতে হবে এবং উপরের মতো লেখা থাকলে ব্রেস ডিলিমিট প্যাকেজ ঘোষণার ফর্মটি আবশ্যক।

এগুলি কি সাধারণ ব্যবহারে রয়েছে? যদি তাই হয়, কিভাবে?



4
@ ব্রেন্ট, এটি প্যাকেজ অবজেক্ট নিবন্ধের জন্য নয়, এটি একটি দুর্দান্ত উত্স। আমি লেখকের কথা শুনেছি কিন্তু বুঝতে পারি নি যে তিনি এই স্কালা সফরটি লিখেছেন, ধন্যবাদ।
ডন ম্যাকেনজি

উত্তর:


128

সাধারণত আপনি নিজের প্যাকেজটির সাথে সম্পর্কিত প্যাকেজে ডাকা একটি পৃথক ফাইলে রাখবেন package.scala। আপনি নেস্টেড প্যাকেজ সিনট্যাক্সও ব্যবহার করতে পারেন তবে এটি বেশ অস্বাভাবিক।

প্যাকেজ অবজেক্টগুলির জন্য প্রধান ব্যবহারের ক্ষেত্রটি হল যখন আপনি প্যাকেজের দ্বারা সংজ্ঞায়িত API ব্যবহার করেন তখন আপনার প্যাকেজের অভ্যন্তরের বিভিন্ন স্থানে এবং প্যাকেজের বাইরেও আপনার সংজ্ঞা প্রয়োজন হয়। এখানে একটি উদাহরণ:

// file: foo/bar/package.scala

package foo

package object bar {

  // package wide constants:
  def BarVersionString = "1.0"

  // or type aliases
  type StringMap[+T] = Map[String,T]

  // can be used to emulate a package wide import
  // especially useful when wrapping a Java API
  type DateTime = org.joda.time.DateTime

  type JList[T] = java.util.List[T]

  // Define implicits needed to effectively use your API:
  implicit def a2b(a: A): B = // ...

}

এখন সেই প্যাকেজ অবজেক্টের অভ্যন্তরের সংজ্ঞাগুলি পুরো প্যাকেজটির অভ্যন্তরে উপলব্ধ foo.bar। তবুও সংজ্ঞাগুলি আমদানি হয়ে যায় যখন package প্যাকেজের বাইরের কেউ আমদানি করে foo.bar._

এইভাবে আপনি কার্যকরভাবে আপনার লাইব্রেরিটি ব্যবহার করতে অতিরিক্ত আমদানি করার জন্য API ক্লায়েন্টের প্রয়োজনীয়তা রোধ করতে পারেন - যেমন স্কেল-সুইংয়ে আপনাকে লিখতে হবে

import swing._
import Swing._

থেকে সমস্ত ধার্মিকতা মত onEDTএবং অন্তর্নিহিত রূপান্তর Tuple2আছে Dimension


13
সাবধানতার কথা: পদ্ধতি ওভারলোডিং প্যাকেজ অবজেক্টে কাজ করে না।
4-10 এস্ট্রেট্রোনিয়াম

প্যাকেজ বিষয়বস্তুটিকে প্যাকেজ স্তরক্রমের এক স্তর উপরে সংজ্ঞায়িত করা উচিত কেন এটি বেছে নেওয়া হয়েছিল তা আমাকে মারধর করে। উদাহরণস্বরূপ, এর অর্থ হ'ল আপনার নিজের প্যাকেজটির সাথে ভার্চুয়াল orgবা comশীর্ষ স্তরের প্যাকেজটিকে দূষিত করতে হবে যদি আপনি এটি নিজের রুট প্যাকেজের সাথে সম্পর্কিত থাকতে চান org.foo। আমি দেখতে পেয়েছি যে সংজ্ঞাটি সরাসরি প্যাকেজের আওতায় আনতে এটির একটি অংশ হওয়া উচিত - এটি আরও কিছুটা যথাযথ ভাষা এপিআই ইন্টারফেস হত।
ম্যাটানস্টার

নোট যে যেহেতু অন্তত Scala 2.10 এবং ওভারলোডিং উপরে আছে প্যাকেজ বস্তু হবে।
জ্যাস্পার এম এম

58

মরিটজের উত্তর স্পট থাকা অবস্থায়, আরও একটি বিষয় লক্ষণীয় যে প্যাকেজ অবজেক্টগুলি বস্তু। অন্যান্য জিনিসের মধ্যে, এর অর্থ আপনি মিশ্র-ইন উত্তরাধিকার ব্যবহার করে বৈশিষ্ট্যগুলি থেকে এগুলি তৈরি করতে পারেন। মরিটসের উদাহরণ হিসাবে লেখা যেতে পারে

package object bar extends Versioning 
                          with JodaAliases 
                          with JavaAliases {

  // package wide constants:
  override val version = "1.0"

  // or type aliases
  type StringMap[+T] = Map[String,T]

  // Define implicits needed to effectively use your API:
  implicit def a2b(a: A): B = // ...

}

এখানে সংস্করণটি একটি বিমূর্ত বৈশিষ্ট্য, যা বলে যে প্যাকেজ অবজেক্টটির একটি "সংস্করণ" পদ্ধতি থাকা আবশ্যক, যখন জোদাএলিয়াস এবং জাভাএলিয়াস হ্যান্ড টাইপের এলিয়াসযুক্ত কংক্রিট বৈশিষ্ট্য। এই সমস্ত বৈশিষ্ট্য অনেকগুলি পৃথক প্যাকেজ অবজেক্ট দ্বারা পুনরায় ব্যবহার করা যেতে পারে।


পুরো বিষয়টি অনেকটা উন্মুক্ত হচ্ছে এবং এটির পুরো সম্ভাবনাটি ব্যবহার করা হবে বলে মনে হয় না, আরও একটি সমৃদ্ধ উদাহরণের জন্য ধন্যবাদ।
ডন ম্যাকেনজি

4
তবে সেগুলি ভাল হিসাবে ব্যবহার করা যায় না, সুতরাং এগুলি সত্যই বস্তু নয়
এডুয়ার্ডো পেরেজা টোবস

7

সোজা সোর্সে যাওয়ার চেয়ে আপনি আরও খারাপ করতে পারেন। :)

https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/library/scala/package.scala

https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/library/scala/colલેક્//mutable/package.scala


@ অ্যালেক্স ক্রুজ, ধন্যবাদ, এটি মনে হয় যে তাদের একটি পৃথক সংকলন ইউনিট প্রয়োজন (যা সম্ভবত ব্রেস সীমিত প্যাকেজ সীমাবদ্ধতার গোলাকার হয়ে যায়)। সমস্যাটি হ'ল আমি কীভাবে সেগুলি ব্যবহার করব সে সম্পর্কে আমার নিজস্ব অনুমানের চেয়ে কিছু শক্ত ব্যবহারকারী পরামর্শ চাই।
ডন ম্যাকেনজি

5

প্যাকেজ অবজেক্টগুলির জন্য প্রধান ব্যবহারের ক্ষেত্রটি হল যখন আপনি প্যাকেজের দ্বারা সংজ্ঞায়িত API ব্যবহার করেন তখন আপনার প্যাকেজের অভ্যন্তরের বিভিন্ন স্থানে এবং প্যাকেজের বাইরেও আপনার সংজ্ঞা প্রয়োজন হয়।

তাই সঙ্গে Scala 3 মধ্য 2020 রিলিজ করা হবে, নির্ধারিত উপর ভিত্তি করে ছিটগ্রস্ত হিসাবে, এখানে :

টপলেভেল সংজ্ঞা

শীর্ষ স্তরে সমস্ত ধরণের সংজ্ঞা লেখা যেতে পারে।
প্যাকেজ অবজেক্টগুলির আর প্রয়োজন নেই, পর্যায়ক্রমে শেষ করা হবে।

package p 

type Labelled[T] = (String, T) 
val a: Labelled[Int] = ("count", 1) 
def b = a._2 
def hello(name: String) = println(i"hello, $name)

ধন্যবাদ @ ভনসিকে, আমি এই এবং অন্যান্য অনেক কারণে সত্যই 3 স্কালার অপেক্ষায় রয়েছি। আমি প্যাকেজ অবজেক্টগুলির খুব বেশি ব্যবহার করি নি তবে আমি নিশ্চিত যে আমি শীর্ষ স্তরের সংজ্ঞা ব্যবহার করব।
ডন ম্যাকেনজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.