স্কালার কেস ক্লাস এবং ক্লাসের মধ্যে পার্থক্য কী?


440

আমি case classএবং ক এর মধ্যে পার্থক্যগুলি খুঁজে পেতে গুগলে অনুসন্ধান করেছি class। প্রত্যেকে উল্লেখ করেছেন যে আপনি যখন ক্লাসে প্যাটার্ন ম্যাচিং করতে চান তখন কেস ক্লাসটি ব্যবহার করুন। অন্যথায় ক্লাস ব্যবহার করুন এবং কিছু অতিরিক্ত পার্কের সমান এবং হ্যাশ কোড ওভাররাইডের মতো উল্লেখ করুন। তবে এই কি কেবল ক্লাসের পরিবর্তে কেস ক্লাস ব্যবহার করা উচিত?

আমার ধারণা, স্কালায় এই বৈশিষ্ট্যের জন্য খুব গুরুত্বপূর্ণ কারণ থাকতে হবে। ব্যাখ্যাটি কী বা স্কালা কেস ক্লাসগুলি সম্পর্কে আরও জানার জন্য কোনও সংস্থান আছে?

উত্তর:


394

কেস ক্লাসগুলি প্লেইন এবং অপরিবর্তনীয় ডেটা হোল্ডিং অবজেক্ট হিসাবে দেখা যেতে পারে যা কেবল তাদের নির্মাণকারী যুক্তির উপর নির্ভর করে

এই কার্যকরী ধারণা আমাদের অনুমতি দেয়

  • একটি কমপ্যাক্ট সূচনা সিনট্যাক্স ব্যবহার করুন ( Node(1, Leaf(2), None)))
  • প্যাটার্ন ম্যাচিং ব্যবহার করে তাদের পচন করুন
  • সমতা তুলনা সুস্পষ্টভাবে সংজ্ঞায়িত করা আছে

উত্তরাধিকারের সাথে একত্রে, কেস ক্লাসগুলি বীজগণিত ডেটাটাইপগুলি নকল করতে ব্যবহৃত হয় ।

যদি কোনও বস্তু অভ্যন্তরে স্থিতিশীল গণনা সম্পাদন করে বা অন্যান্য ধরণের জটিল আচরণ প্রদর্শন করে তবে এটি একটি সাধারণ শ্রেণি হওয়া উচিত।


11
@ টেজা: একরকমভাবে এডিটি হ'ল কিন্ডা প্যারামিটারাইজড এনামগুলি , অত্যন্ত শক্তিশালী এবং টাইপসেফ।
দারিও

8
বীজগণিত ডেটাটাইপগুলি নকল করতে সিলযুক্ত কেস ক্লাসগুলি ব্যবহৃত হয়। অন্যথায় সাবক্লাসের সংখ্যা সীমাবদ্ধ নয়।
টমাস জং

6
@ থমাস: সঠিকভাবে বলা হয়েছে, সিল করা বিমূর্ত ক্লাস থেকে প্রাপ্ত কেস ক্লাসগুলি বীজগণিত ডেটাটাইপগুলি অনুকরণ করে যেখানে এডিটি অন্যথায় খোলা থাকে
দারিও

2
@ ডারিও ... এবং প্রকারটি অন্যথায় উন্মুক্ত এবং না এবং একটি এডিটি। :-)
টমাস জং

1
@ থমাস: হ্যাঁ, এটি নিছক একটি অস্তিত্বহীন;)
দারিও

165

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

এই জাতীয় ধরণের একটি খুব সাধারণ উদাহরণ হ'ল গাছ। উদাহরণস্বরূপ, একটি বাইনারি গাছ এইভাবে প্রয়োগ করা যেতে পারে:

sealed abstract class Tree
case class Node(left: Tree, right: Tree) extends Tree
case class Leaf[A](value: A) extends Tree
case object EmptyLeaf extends Tree

এটি আমাদের নিম্নলিখিতগুলি করতে সক্ষম করে:

// DSL-like assignment:
val treeA = Node(EmptyLeaf, Leaf(5))
val treeB = Node(Node(Leaf(2), Leaf(3)), Leaf(5))

// On Scala 2.8, modification through cloning:
val treeC = treeA.copy(left = treeB.left)

// Pretty printing:
println("Tree A: "+treeA)
println("Tree B: "+treeB)
println("Tree C: "+treeC)

// Comparison:
println("Tree A == Tree B: %s" format (treeA == treeB).toString)
println("Tree B == Tree C: %s" format (treeB == treeC).toString)

// Pattern matching:
treeA match {
  case Node(EmptyLeaf, right) => println("Can be reduced to "+right)
  case Node(left, EmptyLeaf) => println("Can be reduced to "+left)
  case _ => println(treeA+" cannot be reduced")
}

// Pattern matches can be safely done, because the compiler warns about
// non-exaustive matches:
def checkTree(t: Tree) = t match {
  case Node(EmptyLeaf, Node(left, right)) =>
  // case Node(EmptyLeaf, Leaf(el)) =>
  case Node(Node(left, right), EmptyLeaf) =>
  case Node(Leaf(el), EmptyLeaf) =>
  case Node(Node(l1, r1), Node(l2, r2)) =>
  case Node(Leaf(e1), Leaf(e2)) =>
  case Node(Node(left, right), Leaf(el)) =>
  case Node(Leaf(el), Node(left, right)) =>
  // case Node(EmptyLeaf, EmptyLeaf) =>
  case Leaf(el) =>
  case EmptyLeaf =>
}

নোট করুন যে গাছগুলি একই সিনট্যাক্সের সাথে (প্যাটার্ন ম্যাচের মাধ্যমে) নির্মাণ এবং ডিকনস্ট্রাক্ট করে, এটি ঠিক কীভাবে প্রিন্ট করা হয় (বিয়োগ স্পেস)।

এবং এগুলি হ্যাশ মানচিত্র বা সেটগুলির সাথেও ব্যবহার করা যেতে পারে, যেহেতু তাদের একটি বৈধ, স্থিতিশীল হ্যাশকোড রয়েছে।


71
  • কেস ক্লাসগুলি প্যাটার্ন মেলাতে পারে
  • কেস ক্লাসগুলি স্বয়ংক্রিয়ভাবে হ্যাশকোড এবং সমান সংজ্ঞা দেয়
  • কেস ক্লাসগুলি কন্সট্রাক্টর আর্গুমেন্টগুলির জন্য স্বয়ংক্রিয়ভাবে প্রাপ্ত পদ্ধতিগুলি সংজ্ঞায়িত করে।

(আপনি ইতিমধ্যে সর্বশেষ ব্যতীত সমস্ত উল্লেখ করেছেন)।

নিয়মিত ক্লাসে এগুলি কেবলমাত্র পার্থক্য।


13
কনস্ট্রাক্টর আর্গুমেন্টে "var" সুনির্দিষ্ট না করা থাকলে সেটারগুলি কেস ক্লাসের জন্য উত্পন্ন হয় না, সেক্ষেত্রে আপনি নিয়মিত ক্লাস হিসাবে একই গেটর / সেটার জেনারেশন পান।
মিচ ব্লিভিন্স

1
@ মিচ: সত্য, আমার খারাপ। এখনই স্থির।
sepp2k

আপনি 2 টি পার্থক্য বাদ দিয়েছেন, আমার উত্তর দেখুন।
শেলবি মুর III

@ মিচব্লেইনস, নিয়মিত ক্লাসে সর্বদা গেটর / সেটার জেনারেশন থাকে না।
শেলবি মুর III

কেস ক্লাসগুলি প্রয়োগযোগ্য পদ্ধতিটি সংজ্ঞায়িত করে, এ কারণেই তারা প্যাটার্নটি মেলাতে পারে।
শুভ নির্যাতনকারী

30

কেউ উল্লেখ করেনি যে কেস ক্লাসগুলিও Productএই পদ্ধতির উদাহরণস্বরূপ এবং উত্তরাধিকারী:

def productElement(n: Int): Any
def productArity: Int
def productIterator: Iterator[Any]

যেখানে productArityক্লাস প্যারামিটারের সংখ্যা productElement(i)ফিরে আসে, i প্যারামিটারটি productIteratorদেয় এবং তাদের মাধ্যমে পুনরাবৃত্তি করতে দেয়।


2
এগুলি অবশ্য প্রোডাক্ট 1, প্রোডাক্ট 2 ইত্যাদির উদাহরণ নয়।
জিন-ফিলিপ পালেট

27

কেউ উল্লেখ valকরেনি যে কেস ক্লাসগুলির কনস্ট্রাক্টর প্যারামিটার রয়েছে তবে এটি নিয়মিত ক্লাসগুলির জন্যও ডিফল্ট (যা আমি মনে করি স্কালার ডিজাইনের একটি অসঙ্গতি )। দারিও এমন মন্তব্য করেছিলেন যেখানে তিনি উল্লেখ করেছিলেন যে তারা " অপরিবর্তনীয় "।

নোট আপনি varকেস ক্লাসের জন্য প্রতিটি নির্মাণকারীর যুক্তি প্রিপেন্ড করে ডিফল্টটিকে ওভাররাইড করতে পারেন । যাইহোক, কেস ক্লাসগুলিকে পরিবর্তনযোগ্য করে তোলা তাদের equalsএবং hashCodeপদ্ধতিগুলি সময়ের বৈকল্পিক হতে পারে [[1]

sepp2k ইতিমধ্যে উল্লেখ করেছে যে কেস ক্লাসগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন হয় equalsএবং hashCodeপদ্ধতিগুলি।

এছাড়াও কেউ উল্লেখ করেনি যে কেস ক্লাসগুলি স্বয়ংক্রিয়ভাবে ক্লাস objectহিসাবে একই নামের সাথে একটি সহচর তৈরি করে, এতে রয়েছে applyএবং unapplyপদ্ধতিগুলি। applyপদ্ধতি সঙ্গে prepending ছাড়া দৃষ্টান্ত নির্মাণের সম্ভব newunapplyনিষ্কর্ষক পদ্ধতি প্যাটার্ন ম্যাচিং যা অন্যদের উল্লিখিত দেয়।

এছাড়াও কম্পাইলার গতি সেরা অনুকূল রূপ match- caseকেস শ্রেণীর জন্য প্যাটার্ন ম্যাচিং [2]।

[1] কেস ক্লাসগুলি দুর্দান্ত

[2] কেস ক্লাস এবং এক্সট্র্যাক্টর, পৃষ্ঠা 15


12

স্কালায় কেস ক্লাস কনস্ট্রাক্টকে কিছু বয়লারলেট অপসারণ করার সুবিধা হিসাবেও দেখা যেতে পারে।

কেস ক্লাস নির্মাণের সময় স্কালা আপনাকে নিম্নলিখিতটি দেয়।

  • এটি একটি শ্রেণি তৈরি করার পাশাপাশি এর সহযোগী বস্তু তৈরি করে
  • এর সহযোগী অবজেক্টটি এমন একটি applyপদ্ধতি প্রয়োগ করে যা আপনি কারখানার পদ্ধতি হিসাবে ব্যবহার করতে সক্ষম হন। নতুন কীওয়ার্ডটি ব্যবহার না করে আপনি সিনট্যাকটিক চিনির সুবিধা পাবেন।

কারণ শ্রেণিটি অবিচ্ছেদ্য আপনি অ্যাকসেসর পাবেন যা কেবল শ্রেণীর ভেরিয়েবল (বা বৈশিষ্ট্য) তবে কোনও মিউটর নেই (সুতরাং ভেরিয়েবলগুলি পরিবর্তন করার ক্ষমতা নেই)। কনস্ট্রাক্টর পরামিতিগুলি আপনার কাছে কেবল পঠিত ক্ষেত্র হিসাবে স্বয়ংক্রিয়ভাবে উপলব্ধ automatically জাভা বিন বিন্যাসের তুলনায় অনেক ভাল ব্যবহার।

  • এছাড়াও আপনি পেতে hashCode, equalsএবং toStringডিফল্ট ভাবে পদ্ধতি এবং equalsপদ্ধতি একটি বস্তু গঠনের দিক তুলনা করা হয়। কোনও copyপদ্ধতি ক্লোন করতে সক্ষম হওয়ার জন্য উত্পন্ন হয় (কিছু ক্ষেত্রের ক্ষেত্রে পদ্ধতিতে নতুন মান সরবরাহ করা হয়)।

আগে উল্লেখ করা হয়েছে সবচেয়ে বড় সুবিধা হ'ল আপনি কেস ক্লাসগুলিতে প্যাটার্ন মেলে নিতে পারেন। এর কারণ হ'ল আপনি এমন unapplyপদ্ধতিটি পান যা আপনাকে ক্ষেত্রগুলি নিষ্কাশনের জন্য কেস ক্লাসটি ডিকনস্ট্রাক্ট করতে দেয়।


মূলত কেস ক্লাস তৈরি করার সময় আপনি স্কালার কাছ থেকে কী পাচ্ছেন (বা যদি আপনার শ্রেণীর কোনও যুক্তি না নেয় তবে কোনও কেস অবজেক্ট) হ'ল একটি সিঙ্গলটন অবজেক্ট যা কারখানায় এবং নিষ্কর্ষক হিসাবে উদ্দেশ্যটি সরবরাহ করে ।


আপনার কেন একটি অপরিবর্তনীয় বস্তুর অনুলিপি লাগবে?
পাওলো ইবারম্যান 16

@ পাওলোএবারম্যান কারণ copyপদ্ধতিটি ক্ষেত্রগুলিকে সংশোধন করতে পারে:val x = y.copy(foo="newValue")
থিলো

8

লোকেরা ইতিমধ্যে যা বলেছে তা ছাড়াও classএবং এর মধ্যে আরও কিছু মৌলিক পার্থক্য রয়েছেcase class

১. Case Classসুস্পষ্ট প্রয়োজন নেই new, যখন ক্লাসের সাথে ডাকতে হবেnew

val classInst = new MyClass(...)  // For classes
val classInst = MyClass(..)       // For case class

2. ডিফল্ট কনস্ট্রাক্টরগুলির মাধ্যমে পরামিতিগুলি ব্যক্তিগত হয় class, যদিও এর সর্বজনীন হয়case class

// For class
class MyClass(x:Int) { }
val classInst = new MyClass(10)

classInst.x   // FAILURE : can't access

// For caseClass
case class MyClass(x:Int) { }
val classInst = MyClass(10)

classInst.x   // SUCCESS

3. case classমান দ্বারা তাদের তুলনা

// case Class
class MyClass(x:Int) { }

val classInst = new MyClass(10)
val classInst2 = new MyClass(10)

classInst == classInst2 // FALSE

// For Case Class
case class MyClass(x:Int) { }

val classInst = MyClass(10)
val classInst2 = MyClass(10)

classInst == classInst2 // TRUE

6

স্কালার ডকুমেন্টেশন অনুসারে :

কেস ক্লাসগুলি কেবল নিয়মিত ক্লাস যা:

  • ডিফল্টরূপে অপরিবর্তনীয়
  • প্যাটার্ন মিলের মাধ্যমে নিষ্প্রয়োজনীয়
  • রেফারেন্সের পরিবর্তে কাঠামোগত সমতা দ্বারা তুলনা করা
  • তাত্ক্ষণিকভাবে চালিত এবং চালিত করতে সুসংযোগ করুন

কেস কীওয়ার্ডের আর একটি বৈশিষ্ট্য হ'ল সংকলকটি স্বয়ংক্রিয়ভাবে জাভাতে পরিচিত স্ট্রিং, সমান এবং হ্যাশকোড পদ্ধতি সহ আমাদের জন্য বিভিন্ন পদ্ধতি তৈরি করে।


5

ক্লাস:

scala> class Animal(name:String)
defined class Animal

scala> val an1 = new Animal("Padddington")
an1: Animal = Animal@748860cc

scala> an1.name
<console>:14: error: value name is not a member of Animal
       an1.name
           ^

তবে আমরা যদি একই কোড ব্যবহার করি তবে কেস ক্লাস ব্যবহার করি:

scala> case class Animal(name:String)
defined class Animal

scala> val an2 = new Animal("Paddington")
an2: Animal = Animal(Paddington)

scala> an2.name
res12: String = Paddington


scala> an2 == Animal("fred")
res14: Boolean = false

scala> an2 == Animal("Paddington")
res15: Boolean = true

ব্যক্তি শ্রেণি:

scala> case class Person(first:String,last:String,age:Int)
defined class Person

scala> val harry = new Person("Harry","Potter",30)
harry: Person = Person(Harry,Potter,30)

scala> harry
res16: Person = Person(Harry,Potter,30)
scala> harry.first = "Saily"
<console>:14: error: reassignment to val
       harry.first = "Saily"
                   ^
scala>val saily =  harry.copy(first="Saily")
res17: Person = Person(Saily,Potter,30)

scala> harry.copy(age = harry.age+1)
res18: Person = Person(Harry,Potter,31)

প্যাটার্ন ম্যাচিং:

scala> harry match {
     | case Person("Harry",_,age) => println(age)
     | case _ => println("no match")
     | }
30

scala> res17 match {
     | case Person("Harry",_,age) => println(age)
     | case _ => println("no match")
     | }
no match

অবজেক্ট: সিঙ্গলটন:

scala> case class Person(first :String,last:String,age:Int)
defined class Person

scala> object Fred extends Person("Fred","Jones",22)
defined object Fred

5

কেস ক্লাস কী তা সম্পর্কে চূড়ান্ত বোঝার জন্য:

আসুন নিম্নলিখিত কেস শ্রেণীর সংজ্ঞাটি ধরে নেওয়া যাক:

case class Foo(foo:String, bar: Int)

এবং তারপরে টার্মিনালে নিম্নলিখিতটি করুন:

$ scalac -print src/main/scala/Foo.scala

স্কেল 2.12.8 আউটপুট দেবে:

...
case class Foo extends Object with Product with Serializable {

  <caseaccessor> <paramaccessor> private[this] val foo: String = _;

  <stable> <caseaccessor> <accessor> <paramaccessor> def foo(): String = Foo.this.foo;

  <caseaccessor> <paramaccessor> private[this] val bar: Int = _;

  <stable> <caseaccessor> <accessor> <paramaccessor> def bar(): Int = Foo.this.bar;

  <synthetic> def copy(foo: String, bar: Int): Foo = new Foo(foo, bar);

  <synthetic> def copy$default$1(): String = Foo.this.foo();

  <synthetic> def copy$default$2(): Int = Foo.this.bar();

  override <synthetic> def productPrefix(): String = "Foo";

  <synthetic> def productArity(): Int = 2;

  <synthetic> def productElement(x$1: Int): Object = {
    case <synthetic> val x1: Int = x$1;
        (x1: Int) match {
            case 0 => Foo.this.foo()
            case 1 => scala.Int.box(Foo.this.bar())
            case _ => throw new IndexOutOfBoundsException(scala.Int.box(x$1).toString())
        }
  };

  override <synthetic> def productIterator(): Iterator = scala.runtime.ScalaRunTime.typedProductIterator(Foo.this);

  <synthetic> def canEqual(x$1: Object): Boolean = x$1.$isInstanceOf[Foo]();

  override <synthetic> def hashCode(): Int = {
     <synthetic> var acc: Int = -889275714;
     acc = scala.runtime.Statics.mix(acc, scala.runtime.Statics.anyHash(Foo.this.foo()));
     acc = scala.runtime.Statics.mix(acc, Foo.this.bar());
     scala.runtime.Statics.finalizeHash(acc, 2)
  };

  override <synthetic> def toString(): String = scala.runtime.ScalaRunTime._toString(Foo.this);

  override <synthetic> def equals(x$1: Object): Boolean = Foo.this.eq(x$1).||({
      case <synthetic> val x1: Object = x$1;
        case5(){
          if (x1.$isInstanceOf[Foo]())
            matchEnd4(true)
          else
            case6()
        };
        case6(){
          matchEnd4(false)
        };
        matchEnd4(x: Boolean){
          x
        }
    }.&&({
      <synthetic> val Foo$1: Foo = x$1.$asInstanceOf[Foo]();
      Foo.this.foo().==(Foo$1.foo()).&&(Foo.this.bar().==(Foo$1.bar())).&&(Foo$1.canEqual(Foo.this))
  }));

  def <init>(foo: String, bar: Int): Foo = {
    Foo.this.foo = foo;
    Foo.this.bar = bar;
    Foo.super.<init>();
    Foo.super./*Product*/$init$();
    ()
  }
};

<synthetic> object Foo extends scala.runtime.AbstractFunction2 with Serializable {

  final override <synthetic> def toString(): String = "Foo";

  case <synthetic> def apply(foo: String, bar: Int): Foo = new Foo(foo, bar);

  case <synthetic> def unapply(x$0: Foo): Option =
     if (x$0.==(null))
        scala.None
     else
        new Some(new Tuple2(x$0.foo(), scala.Int.box(x$0.bar())));

  <synthetic> private def readResolve(): Object = Foo;

  case <synthetic> <bridge> <artifact> def apply(v1: Object, v2: Object): Object = Foo.this.apply(v1.$asInstanceOf[String](), scala.Int.unbox(v2));

  def <init>(): Foo.type = {
    Foo.super.<init>();
    ()
  }
}
...

যেমনটি আমরা দেখতে পাচ্ছি স্কালা সংকলক একটি নিয়মিত শ্রেণি Fooএবং সহচর-বস্তু উত্পাদন করে Foo

আসুন সংকলিত ক্লাসের মধ্যে যাব এবং আমরা কী পেয়েছি সে সম্পর্কে মন্তব্য করুন:

  • Fooশ্রেণীর অভ্যন্তরীণ অবস্থা , স্থাবর:
val foo: String
val bar: Int
  • getters:
def foo(): String
def bar(): Int
  • কপি পদ্ধতি:
def copy(foo: String, bar: Int): Foo
def copy$default$1(): String
def copy$default$2(): Int
  • scala.Productবৈশিষ্ট্য প্রয়োগ :
override def productPrefix(): String
def productArity(): Int
def productElement(x$1: Int): Object
override def productIterator(): Iterator
  • scala.Equalsসাম্যর জন্য কেস ক্লাসের উদাহরণগুলির তুলনাযোগ্য করে তুলতে বৈশিষ্ট্য প্রয়োগ করে ==:
def canEqual(x$1: Object): Boolean
override def equals(x$1: Object): Boolean
  • java.lang.Object.hashCodeসমান-হ্যাশকোড চুক্তি মানার জন্য ওভাররাইডিং :
override <synthetic> def hashCode(): Int
  • ওভাররাইডিং java.lang.Object.toString:
override def toString(): String
  • newকীওয়ার্ড দ্বারা ইনস্ট্যান্টেশন জন্য কনস্ট্রাক্টর :
def <init>(foo: String, bar: Int): Foo 

অবজেক্ট ফু: - কীওয়ার্ড applyছাড়াই ইনস্ট্যান্টেশন করার পদ্ধতি new:

case <synthetic> def apply(foo: String, bar: Int): Foo = new Foo(foo, bar);
  • unupplyপ্যাটার্ন ম্যাচিংয়ে কেস ক্লাস ফু ব্যবহার করার জন্য এক্সট্রাক্টর পদ্ধতি :
case <synthetic> def unapply(x$0: Foo): Option
  • আরও একটি উদাহরণ তৈরি করতে না দেওয়ার জন্য ডিসিজারাইজেশন থেকে অবজেক্টটিকে সিঙ্গলটন হিসাবে রক্ষা করার পদ্ধতি:
<synthetic> private def readResolve(): Object = Foo;
  • অবজেক্ট ফু এ scala.runtime.AbstractFunction2জাতীয় কৌশল করার জন্য প্রসারিত :
scala> case class Foo(foo:String, bar: Int)
defined class Foo

scala> Foo.tupled
res1: ((String, Int)) => Foo = scala.Function2$$Lambda$224/1935637221@9ab310b

tupled বস্তু থেকে 2 টি উপাদানের একটি টিপল প্রয়োগ করে একটি নতুন ফু তৈরি করার জন্য একটি মজাদার ফিরিয়ে দেয়।

সুতরাং কেস ক্লাসটি কেবল সিনট্যাকটিক চিনি।


4

ক্লাসগুলির বিপরীতে, কেস ক্লাসগুলি কেবল ডেটা ধরে রাখতে ব্যবহৃত হয়।

কেস ক্লাসগুলি ডেটা-কেন্দ্রিক অ্যাপ্লিকেশনগুলির জন্য নমনীয়, যার অর্থ আপনি কেস ক্লাসে ডেটা ক্ষেত্রগুলি সংজ্ঞায়িত করতে এবং কোনও সহযোগী অবজেক্টে ব্যবসায়িক যুক্তি সংজ্ঞায়িত করতে পারেন। এইভাবে, আপনি ব্যবসায়িক যুক্তি থেকে ডেটা আলাদা করছেন।

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


3

কেউ উল্লেখ করেনি যে কেস শ্রেণীর সহযোগী অবজেক্টের tupledডিফেনশন রয়েছে, যার একটি প্রকার রয়েছে:

case class Person(name: String, age: Int)
//Person.tupled is def tupled: ((String, Int)) => Person

আমি কেবলমাত্র ব্যবহারের কেসটিই সন্ধান করতে পারি যখন আপনি টুপল থেকে কেস ক্লাস তৈরি করতে পারেন, উদাহরণস্বরূপ:

val bobAsTuple = ("bob", 14)
val bob = (Person.apply _).tupled(bobAsTuple) //bob: Person = Person(bob,14)

আপনি সরাসরি বস্তু তৈরি করে টিপলড ছাড়াই একই কাজটি করতে পারেন, তবে যদি আপনার ডেটাসেটগুলি আর্টিটি 20 (20 উপাদানগুলির সাথে টিপল) সহ টুপলের তালিকার হিসাবে প্রকাশ করা হয় তবে আপনার পছন্দসই টিপল ব্যবহার করা যেতে পারে।


3

একটি কেস বর্গ একটি বর্গ যে সঙ্গে ব্যবহার করা যেতে পারে হয় match/caseবিবৃতি।

def isIdentityFun(term: Term): Boolean = term match {
  case Fun(x, Var(y)) if x == y => true
  case _ => false
}

আপনি দেখেন যে caseমজা শ্রেণীর ফ্যানের উদাহরণ রয়েছে যার দ্বিতীয় প্যারামিটারটি একটি ভার Var এটি একটি খুব সুন্দর এবং শক্তিশালী বাক্য গঠন, তবে এটি কোনও শ্রেণীর উদাহরণ দিয়ে কাজ করতে পারে না, তাই কেস ক্লাসগুলির জন্য কিছু বিধিনিষেধ রয়েছে। এবং যদি এই বিধিনিষেধগুলি মান্য করা হয় তবে স্বয়ংক্রিয়ভাবে হ্যাশকোড এবং সমান সংজ্ঞা দেওয়া সম্ভব।

অস্পষ্ট বাক্যাংশ "প্যাটার্ন মিলের মাধ্যমে পুনরাবৃত্তাকার পচন প্রক্রিয়া" এর অর্থ কেবল "এটি এর সাথে কাজ করে case"। (প্রকৃতপক্ষে, এরপরের উদাহরণটি পরবর্তী উদাহরণগুলির matchসাথে (বিপরীতে মিলিত) সাথে তুলনা করা হয়case , স্কালাকে তাদের উভয়কেই পচন করতে হবে এবং সেগুলি যা তৈরি সেগুলি পুনরাবৃত্তভাবে পচন করতে হবে))

কি ক্ষেত্রে শ্রেণীর জন্য দরকারী? সম্পর্কে বীজগাণিতিক ডেটা প্রকার Wikipedia নিবন্ধটি দুই ভাল শাস্ত্রীয় উদাহরণ, তালিকা এবং গাছ দেয়। যে কোনও আধুনিক ক্রিয়ামূলক ভাষার জন্য বীজগণিত ডেটা ধরণের (তাদের সাথে কীভাবে তুলনা করতে হবে তা জানার জন্য সমর্থন) প্রয়োজনীয়তা।

কি ক্ষেত্রে শ্রেণীর জন্য দরকারী নয় ? কিছু বস্তুর স্টেট থাকে, কোডটি connection.setConnectTimeout(connectTimeout)ক্লাসের জন্য নয়।

এবং এখন আপনি স্কাল এর একটি ট্যুর পড়তে পারেন : কেস ক্লাসগুলি


2

আমি মনে করি সামগ্রিকভাবে সমস্ত উত্তর ক্লাস এবং কেস ক্লাস সম্পর্কে একটি অর্থপূর্ণ ব্যাখ্যা দিয়েছে। এটি খুব প্রাসঙ্গিক হতে পারে, তবে স্কেলার প্রতিটি নবজাতকের জানা উচিত যখন আপনি কেস ক্লাস তৈরি করেন তখন কী ঘটে। আমি লিখেছি এই উত্তরটি , যা সংক্ষেপে কেস ক্লাসটি ব্যাখ্যা করে।

প্রতিটি প্রোগ্রামারকে জানা উচিত যে তারা যদি কোনও প্রাক-বিল্ট ফাংশন ব্যবহার করে থাকে তবে তারা তুলনামূলকভাবে কম কোড লিখছে যা এগুলি সবচেয়ে অনুকূলিত কোড লেখার ক্ষমতা দিয়ে তাদেরকে সক্ষম করে দিচ্ছে, তবে শক্তিটি দুর্দান্ত দায়িত্ব নিয়ে আসে। সুতরাং, খুব সাবধানতার সাথে প্রাক বিল্ট ফাংশন ব্যবহার করুন।

কিছু বিকাশকারী অতিরিক্ত ২০ টি পদ্ধতির কারণে কেস ক্লাস লেখার বিষয়টি এড়ান, যা আপনি ক্লাস ফাইলটি বিচ্ছিন্ন করে দেখতে পারেন।

আপনি যদি কোনও কেস ক্লাসের ভিতরে সমস্ত পদ্ধতি পরীক্ষা করতে চান তবে দয়া করে এই লিঙ্কটি উল্লেখ করুন


1
  • কেস ক্লাসগুলি প্রয়োগ এবং প্রয়োগযোগ্য পদ্ধতিগুলির সাথে একটি কম্পেগন বস্তুকে সংজ্ঞায়িত করে
  • কেস ক্লাসগুলি সিরিয়ালাইজেবল প্রসারিত করে
  • কেস ক্লাসগুলি হ্যাশকোড এবং অনুলিপি পদ্ধতিগুলির সমান সংজ্ঞা দেয়
  • কনস্ট্রাক্টরের সমস্ত বৈশিষ্ট্য হ'ল ভাল (সিনট্যাকটিক চিনি)

1

এর কয়েকটি মূল বৈশিষ্ট্য case classesনীচে তালিকাভুক্ত করা হয়েছে

  1. কেস ক্লাসগুলি পরিবর্তনযোগ্য।
  2. আপনি newকীওয়ার্ড ছাড়াই কেস ক্লাস ইনস্ট্যান্ট করতে পারেন ।
  3. কেস ক্লাসগুলি মান দ্বারা তুলনা করা যেতে পারে

স্কালা ডকুমেন্ট থেকে নেওয়া স্কেলা ফ্রিডিতে নমুনা স্কালা কোড।

https://scalafiddle.io/sf/34XEQyE/0

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