কেস ক্লাসের সহচর ক্ষেত্রে কীভাবে ওভাররাইড করা যায়


84

সুতরাং পরিস্থিতি এখানে। আমি এর মতো কেস ক্লাসটি সংজ্ঞায়িত করতে চাই:

case class A(val s: String)

এবং আমি যখন কোনও শ্রেণীর উদাহরণ তৈরি করি তখন 's' এর মান সর্বদা বড় হাতের নাগালে থাকে তা নিশ্চিত করার জন্য আমি কোনও অবজেক্টকে সংজ্ঞায়িত করতে চাই:

object A {
  def apply(s: String) = new A(s.toUpperCase)
}

তবে এটি কার্যকর হয় না যেহেতু স্কালা অভিযোগ করছে যে প্রয়োগ (গুলি: স্ট্রিং) পদ্ধতিটি দু'বার সংজ্ঞায়িত হয়েছে। আমি বুঝতে পারি কেস ক্লাস সিনট্যাক্সটি স্বয়ংক্রিয়ভাবে আমার জন্য এটি সংজ্ঞায়িত করবে, তবে আমি এটি অর্জন করার অন্য কোনও উপায় নেই? আমি কেস ক্লাসের সাথে লেগে থাকতে চাই যেহেতু আমি এটি প্যাটার্ন মিলের জন্য ব্যবহার করতে চাই।


4
সম্ভবত শিরোনামটি "কেস শ্রেণীর সহচর ক্ষেত্রে কীভাবে ওভাররাইড করা যায়" এ পরিবর্তন করুন
ziggystar

4
আপনি যা চান তা যদি না করে তবে চিনি ব্যবহার করবেন না ...
রাফেল

7
@ রাফেল আপনি যদি ব্রাউন সুগার চান, তবে আমরা কিছু বিশেষ বৈশিষ্ট্যযুক্ত চিনি চাই কী .. আমার ওপির মতো একই তদন্ত আছে: কেস ক্লাসগুলি দরকারী, তবে সহযোজনী জিনিসটি সাজাতে চাইলে এটি যথেষ্ট সাধারণ ব্যবহারের ক্ষেত্রে একটি অতিরিক্ত প্রয়োগ।
স্টিফেনবোশ

এফওয়াইআই এটি স্কেল 2.12+ এ ঠিক করা হয়েছে। সঙ্গীতে অন্যথায় বিবাদী প্রয়োগের পদ্ধতিটি সংজ্ঞায়িত করা ডিফল্ট প্রয়োগ পদ্ধতি উত্পন্ন করতে বাধা দেয়।
স্টিওস্কয়ার্ড

উত্তর:


90

দ্বন্দ্বের কারণ হ'ল কেস ক্লাস হুবহু একই প্রয়োগ () পদ্ধতি (একই স্বাক্ষর) সরবরাহ করে।

সবার আগে আমি আপনাকে প্রয়োজনীয়গুলি ব্যবহারের পরামর্শ দিতে চাই:

case class A(s: String) {
  require(! s.toCharArray.exists( _.isLower ), "Bad string: "+ s)
}

এটির ক্ষেত্রে একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে যদি ব্যবহারকারী কোনও উদাহরণ তৈরি করতে চেষ্টা করে যেখানে এর মধ্যে ছোট ছোট অক্ষর রয়েছে includes এটি কেস ক্লাসগুলির একটি ভাল ব্যবহার, যেহেতু আপনি কন্সট্রাক্টরের মধ্যে যা রেখেছেন সেটি হ'ল আপনি যখন প্যাটার্ন ম্যাচিং ( match) ব্যবহার করেন তখন আপনি কী খুঁজে পাবেন ।

যদি আপনি যা চান এটি যদি না হয় তবে আমি কনস্ট্রাক্টরকে তৈরি করব privateএবং ব্যবহারকারীদের কেবল প্রয়োগের পদ্ধতিটি প্রয়োগ করতে বাধ্য করব :

class A private (val s: String) {
}

object A {
  def apply(s: String): A = new A(s.toUpperCase)
}

যেমন আপনি দেখতে পাচ্ছেন, A আর নেই case class। আমি নিশ্চিত নই যে অপরিবর্তনীয় ক্ষেত্রগুলি সহ কেস ক্লাসগুলি আগত মানগুলি সংশোধন করার জন্য বোঝানো হয়েছে, যেহেতু "কেস ক্লাস" নামটি বোঝায় যে এটি ব্যবহার করে (অশোধিত) নির্মাণকারী যুক্তিগুলি বের করা সম্ভব হওয়া উচিত match


4
toCharArrayকল করার প্রয়োজন নেই, এছাড়াও আপনি লিখতে পারেন s.exists(_.isLower)
ফ্রাঙ্ক এস থমাস

4
আমি মনে করি বিটিডাব্লু এর s.forall(_.isUpper)চেয়ে বোঝা সহজ !s.exists(_.isLower)
ফ্রাঙ্ক এস থমাস

ধন্যবাদ! এটি অবশ্যই আমার প্রয়োজনের জন্য কাজ করে। @ ফ্র্যাঙ্ক, আমি সম্মতি জানাই যে s.forall(_isupper)এটি পড়া সহজ। আমি @ ওলে এর পরামর্শের সাথে এটি ব্যবহার করব।
জন এস

4
"নাম" কেস ক্লাস "এর জন্য +1 এ বোঝায় যে ব্যবহার করে (মোডে না পরিবর্তিত) কনস্ট্রাক্টর যুক্তিগুলি বের করা সম্ভব হওয়া উচিত match" "
ইউজেন লাবুন

4
@ollekullberg ওপির পছন্দসই প্রভাব অর্জনের জন্য আপনাকে কেস ক্লাস (এবং কেস ক্লাস ডিফল্টরূপে কেস ক্লাস সরবরাহ করে এমন সমস্ত অতিরিক্ত গুজি হারাতে হবে) ব্যবহার করা থেকে দূরে যেতে হবে না। আপনি যদি দুটি পরিবর্তন করেন তবে আপনার কেস ক্লাস থাকতে পারে এবং এটিও খাওয়া যায়! ক) কেস ক্লাসটি বিমূর্ত হিসাবে চিহ্নিত করুন এবং খ) কেস শ্রেণি নির্মাতাকে ব্যক্তিগত [এ] (কেবলমাত্র ব্যক্তিগতের বিপরীতে) হিসাবে চিহ্নিত করুন। এই কৌশলটি ব্যবহার করে কেস ক্লাস বাড়ানো সম্পর্কে আরও কিছু সূক্ষ্ম সমস্যা রয়েছে। : দয়া করে উত্তর দিন আমি আরো পুঙ্খানুপুঙ্খ বিস্তারিত জানার জন্য পোস্ট দেখুন stackoverflow.com/a/25538287/501113
chaotic3quilibrium

28

আপডেট 2016/02/25:
যদিও আমি নীচে লিখেছি উত্তর যথেষ্ট ছিল, কেস ক্লাসের সহযোগী অবজেক্ট সম্পর্কিত এটি সম্পর্কিত আরও একটি জবাব উল্লেখ করাও মূল্যবান। যথা, কেউ কীভাবে সংকলক উত্পাদিত অন্তর্নিহিত সহকর্মী অবজেক্টটি পুনরুত্পাদন করে যখন ঘটে কেবল যখন কেস ক্লাসটি নিজেই সংজ্ঞায়িত করা হয়। আমার জন্য, এটি পাল্টা স্বজ্ঞাত হয়ে উঠেছে।


সংক্ষিপ্তসার:
কেস ক্লাসের প্যারামিটারের মান কেস ক্লাসে সংরক্ষণ করার আগে আপনি এটি কেবলমাত্র বৈধ (আটেড) এডিটি (অ্যাবস্ট্রাক্ট ডেটা টাইপ) বাকী থাকাতে পরিবর্তন করতে পারেন। যদিও সমাধানটি তুলনামূলকভাবে সহজ ছিল, বিশদটি আবিষ্কার করা কিছুটা চ্যালেঞ্জিং ছিল।

বিশদ:
আপনি যদি কেবলমাত্র আপনার কেস শ্রেণির বৈধ উদাহরণগুলি নিশ্চিত করতে চান যা কোনও এডিটি (অ্যাবস্ট্রাক্ট ডেটা টাইপ) এর পিছনে একটি অত্যাবশ্যক অনুমান, তবে আপনাকে অবশ্যই অনেক কিছু করতে হবে।

উদাহরণস্বরূপ, একটি সংকলক উত্পন্ন copyপদ্ধতি কেস ক্লাসে ডিফল্টরূপে সরবরাহ করা হয়। সুতরাং, আপনি যদি নিশ্চিত হয়েছিলেন যে কেবলমাত্র স্পষ্টত সহযোগী অবজেক্টের applyপদ্ধতির মাধ্যমেই কেবলমাত্র উদাহরণ তৈরি করা হয়েছিল যা গ্যারান্টিযুক্ত যে তারা কেবল উচ্চতর ক্ষেত্রে মানগুলি ধারণ করতে পারে তবে নিম্নলিখিত কোডটি একটি নিম্ন কেস মান সহ কেস শ্রেণীর উদাহরণ তৈরি করবে:

val a1 = A("Hi There") //contains "HI THERE"
val a2 = a1.copy(s = "gotcha") //contains "gotcha"

অতিরিক্তভাবে, কেস ক্লাসগুলি প্রয়োগ করে java.io.Serializable। এর অর্থ হল যে আপনার সাবধানতার কৌশলটি কেবল উচ্চতর ক্ষেত্রে যেমন একটি সাধারণ পাঠ্য সম্পাদক এবং deserialization দ্বারা বিভক্ত করা যেতে পারে।

সুতরাং, আপনার কেস ক্লাসটি বিভিন্ন উপায়ে ব্যবহার করা যেতে পারে (উদারতা এবং / বা খারাপভাবে), আপনার অবশ্যই করা কর্মগুলি এখানে:

  1. আপনার সুস্পষ্ট সহচর বস্তুর জন্য:
    1. আপনার কেস ক্লাসের মতো একই নাম ব্যবহার করে এটি তৈরি করুন
      • এটি কেস ক্লাসের ব্যক্তিগত অংশগুলিতে অ্যাক্সেস করতে পারে
    2. applyআপনার কেস শ্রেণির জন্য প্রাথমিক নির্মাতার মতো ঠিক একই স্বাক্ষর সহ একটি পদ্ধতি তৈরি করুন
      • ২.১ ধাপ শেষ হয়ে গেলে এটি সফলভাবে সংকলন করবে
    3. newঅপারেটরটি ব্যবহার করে কেস ক্লাসের উদাহরণ গ্রহণ করে একটি ফাঁকা বাস্তবায়ন সরবরাহ করুন implementation{}
      • এটি এখন আপনার শর্তাদির উপর কঠোরভাবে কেস ক্লাস ইনস্ট্যান্ট করবে
      • খালি বাস্তবায়ন {}অবশ্যই সরবরাহ করতে হবে কারণ কেস ক্লাস ঘোষিত হয়েছে abstract(২.১ পদক্ষেপ দেখুন)
  2. আপনার কেস ক্লাসের জন্য:
    1. এটি ঘোষণা করুন abstract
      • applyসঙ্গী অবজেক্টে এমন কোনও পদ্ধতি তৈরি করা থেকে স্কালার সংকলককে বাধা দেয় যা "পদ্ধতির দ্বিগুণ সংজ্ঞায়িত ..." সংকলনের ত্রুটির কারণ ঘটায় (উপরে 1.2 ধাপ)
    2. প্রাথমিক কনস্ট্রাক্টর হিসাবে চিহ্নিত করুন private[A]
      • প্রাথমিক নির্মাতা এখন কেবল কেস ক্লাসে এবং তার সহযোগী অবজেক্টের জন্য উপলব্ধ (যেটি আমরা উপরে ১.১ পদে সংজ্ঞায়িত করেছি)
    3. একটি readResolveপদ্ধতি তৈরি করুন
      1. প্রয়োগ পদ্ধতি ব্যবহার করে একটি বাস্তবায়ন সরবরাহ করুন (উপরে 1.2 ধাপ)
    4. একটি copyপদ্ধতি তৈরি করুন
      1. কেস ক্লাসের প্রাথমিক নির্মাণকারীর মতো ঠিক একই স্বাক্ষর রাখতে এটি সংজ্ঞায়িত করুন
      2. প্রতিটি প্যারামিটারের জন্য একই প্যারামিটারের নামটি ব্যবহার করে একটি ডিফল্ট মান যুক্ত করুন (উদাঃ s: String = s)
      3. প্রয়োগ পদ্ধতি ব্যবহার করে একটি বাস্তবায়ন সরবরাহ করুন (নীচে 1.2 ধাপ)

উপরের ক্রিয়া সহ আপনার কোডটি এখানে পরিবর্তন করা হয়েছে:

object A {
  def apply(s: String, i: Int): A =
    new A(s.toUpperCase, i) {} //abstract class implementation intentionally empty
}
abstract case class A private[A] (s: String, i: Int) {
  private def readResolve(): Object = //to ensure validation and possible singleton-ness, must override readResolve to use explicit companion object apply method
    A.apply(s, i)
  def copy(s: String = s, i: Int = i): A =
    A.apply(s, i)
}

এবং প্রয়োজনীয়গুলি প্রয়োগ করার পরে আপনার কোডটি এখানে রয়েছে (@ollekullberg উত্তরে প্রস্তাবিত) এবং কোনও ধরণের ক্যাশে রাখার জন্য আদর্শ জায়গাটি সনাক্তকরণ:

object A {
  def apply(s: String, i: Int): A = {
    require(s.forall(_.isUpper), s"Bad String: $s")
    //TODO: Insert normal instance caching mechanism here
    new A(s, i) {} //abstract class implementation intentionally empty
  }
}
abstract case class A private[A] (s: String, i: Int) {
  private def readResolve(): Object = //to ensure validation and possible singleton-ness, must override readResolve to use explicit companion object apply method
    A.apply(s, i)
  def copy(s: String = s, i: Int = i): A =
    A.apply(s, i)
}

এবং এই সংস্করণটি আরও সুরক্ষিত / শক্তিশালী যদি এই কোডটি জাভা ইন্টারপের মাধ্যমে ব্যবহার করা হয় (কেস ক্লাসটি প্রয়োগ হিসাবে লুকিয়ে রাখে এবং একটি চূড়ান্ত শ্রেণি তৈরি করে যা ডেরাইভেশনগুলি আটকায়):

object A {
  private[A] abstract case class AImpl private[A] (s: String, i: Int)
  def apply(s: String, i: Int): A = {
    require(s.forall(_.isUpper), s"Bad String: $s")
    //TODO: Insert normal instance caching mechanism here
    new A(s, i)
  }
}
final class A private[A] (s: String, i: Int) extends A.AImpl(s, i) {
  private def readResolve(): Object = //to ensure validation and possible singleton-ness, must override readResolve to use explicit companion object apply method
    A.apply(s, i)
  def copy(s: String = s, i: Int = i): A =
    A.apply(s, i)
}

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


আমি মাত্র একটি নতুন বিস্তৃত সমাধান পোস্ট করেছি যাতে আরও স্কেল আইডেম্যাটিক হয় এবং সহজেই ক্যাচিং ক্লাসের দৃষ্টান্তগুলি ক্যাটাগরির জন্য স্ক্যালাচে ব্যবহার করে অন্তর্ভুক্ত করা হয় (মেটা বিধি অনুসারে বিদ্যমান উত্তরটি সম্পাদনা করার অনুমতি ছিল না): কোডরিভিউ.স্ট্যাকেক্সেঞ্জ / এ
বিশৃঙ্খলা

এই বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ। তবে, আমি বুঝতে লড়াই করছি, কেন রিডল রেজোলিউশন বাস্তবায়ন প্রয়োজন। কারণ সংকলনও পাঠ্য সমাধানের বাস্তবায়নও ছাড়াই কাজ করে।
মোগলি

: একটি পৃথক প্রশ্ন পোস্ট stackoverflow.com/questions/32236594/...
mogli

12

আমি জানি না কীভাবে applyএই সহযোগী অবজেক্টে পদ্ধতিটি ওভাররাইড করা যায় (যদি এটি এমনকি সম্ভব হয়) তবে আপনি উচ্চতর ক্ষেত্রে স্ট্রিংয়ের জন্য একটি বিশেষ ধরণেরও ব্যবহার করতে পারেন:

class UpperCaseString(s: String) extends Proxy {
  val self: String = s.toUpperCase
}

implicit def stringToUpperCaseString(s: String) = new UpperCaseString(s)
implicit def upperCaseStringToString(s: UpperCaseString) = s.self

case class A(val s: UpperCaseString)

println(A("hello"))

উপরের কোড আউটপুট:

A(HELLO)

আপনার এই প্রশ্নটিও লক্ষ্য করা উচিত এবং এর উত্তরগুলি: স্কেল: ডিফল্ট কেস ক্লাস নির্মাতাকে ওভাররাইড করা সম্ভব?


তার জন্য ধন্যবাদ - আমি একই লাইন বরাবর ভাবছিলাম কিন্তু সম্পর্কে জানতাম না Proxy! s.toUpperCase একবার হলেও ভাল হতে পারে ।
বেন জ্যাকসন

@ বেন আমি দেখতে পাচ্ছি না যেখানে toUpperCaseএকাধিকবার ডাকা হয়েছে।
ফ্র্যাঙ্ক এস থমাস

তুমি ঠিক বলেছ val self, না def self। আমি মস্তিষ্কে সবে C ++ পেয়েছি।
বেন জ্যাকসন

6

এপ্রিল 2017 এর পরে লোকেরা এটি পড়ছে: স্কাল 2.12.2+ অনুসারে, স্কালা ওভাররাইডিং প্রয়োগ এবং ডিফল্টরূপে প্রয়োগ না করার অনুমতি দেয় । আপনি -Xsource:2.12স্কেলা ২.১১.১১+ তেও সংকলককে বিকল্প দিয়ে এই আচরণটি পেতে পারেন ।


4
এটার মানে কি? এই জ্ঞানটি আমি কীভাবে সমাধানে প্রয়োগ করতে পারি? আপনি একটি উদাহরণ প্রদান করতে পারেন?
k0pernikus

নোট করুন যে প্রয়োগটি প্যাটার্ন ম্যাচিং কেস ক্লাসগুলির জন্য ব্যবহৃত হয় না, যা এটিকে ওভাররাইড করা মোটামুটি অকেজো করে তোলে (যদি আপনি -Xprintএকটি matchবিবৃতি দেখেন তবে দেখবেন যে এটি ব্যবহার করা হয়নি)।
জে Cracknell

5

এটি ভেরিয়েবলের সাথে কাজ করে:

case class A(var s: String) {
   // Conversion
   s = s.toUpperCase
}

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


4

কেস ক্লাস রাখার সময় এবং অন্তর্নিহিত Defs বা অন্য কোনও নির্মাতা না থাকাকালীন আরেকটি ধারণা হ'ল স্বাক্ষরটি applyকিছুটা আলাদা হলেও ব্যবহারকারীর দৃষ্টিকোণ থেকে একই। কোথাও আমি অন্তর্নিহিত কৌশলটি দেখেছি, তবে এটি কোন অন্তর্নিহিত যুক্তি মনে করতে পারে / খুঁজে পায় না, তাই আমি Booleanএখানে বেছে নিয়েছি । যদি কেউ আমাকে সাহায্য করতে এবং কৌশলটি শেষ করতে পারে ...

object A {
  def apply(s: String)(implicit ev: Boolean) = new A(s.toLowerCase)
}
case class A(s: String)

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

আমি কাজের সমাধানের এই পথটি পাইনি (২.১১ সহ)। আমি পরিশেষে কাজ করেছি কেন তিনি স্পষ্টত সহচর বস্তুটিতে তার নিজের প্রয়োগের পদ্ধতিটি সরবরাহ করতে পারেন নি। : আমি উত্তর আমি শুধু পোস্ট এটা পুঙ্খানুপুঙ্খ বর্ননা করেছি stackoverflow.com/a/25538287/501113
chaotic3quilibrium

3

আমি একই সমস্যার মুখোমুখি হয়েছি এবং এই সমাধানটি আমার পক্ষে ঠিক আছে:

sealed trait A {
  def s:String
}

object A {
  private case class AImpl(s:String)
  def apply(s:String):A = AImpl(s.toUpperCase)
}

এবং, যদি কোনও পদ্ধতির প্রয়োজন হয়, তবে কেবল এটির বৈশিষ্ট্যটি সংজ্ঞায়িত করুন এবং কেস ক্লাসে ওভাররাইড করুন।


0

আপনি যদি পুরানো স্কেলার সাথে আটকে থাকেন যেখানে আপনি ডিফল্টরূপে ওভাররাইড করতে পারবেন না বা আপনি @ মেহমেট-ইমের দেখানো হিসাবে সংকলক পতাকাটি যুক্ত করতে চান না, এবং আপনার কেস ক্লাস প্রয়োজন, আপনি নিম্নলিখিতটি করতে পারেন:

case class A(private val _s: String) {
  val s = _s.toUpperCase
}

0

স্কেল ২.১13-তে ২০২০ পর্যন্ত, একই স্বাক্ষরের সাথে কেস ক্লাস প্রয়োগের উপরের দৃশ্যপট সম্পূর্ণ সূক্ষ্মভাবে কাজ করে।

case class A(val s: String)

object A {
  def apply(s: String) = new A(s.toUpperCase)
}

উপরের স্নিপেট সংকলন করেছে এবং স্কেল ২.১৩ এ রিপল এবং নন-রিপল উভয় মোডেই ঠিক আছে।


-2

আমি মনে করি এটি ইতিমধ্যে আপনি এটি করতে চান ঠিক একইভাবে কাজ করে। এখানে আমার রিপল অধিবেশন:

scala> case class A(val s: String)
defined class A

scala> object A {
     | def apply(s: String) = new A(s.toUpperCase)
     | }
defined module A

scala> A("hello")
res0: A = A(HELLO)

এটি স্কেলা ২.৮.১.ফাইনালটি ব্যবহার করছে


4
আমি কোডটি কোনও ফাইলে রাখি এবং এটি সংকলনের চেষ্টা করিলে এটি এখানে কাজ করে না।
ফ্র্যাঙ্ক এস থমাস

আমি বিশ্বাস করি যে আমি পূর্বের উত্তরে অনুরূপ কিছু প্রস্তাব দিয়েছি এবং কেউ বলেছে যে এটি পুনরায় প্রতিস্থাপনের কাজ করার কারণে কেবল এটিই কাজ করে।
বেন জ্যাকসন

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

4
উপরের কোডটি পরীক্ষা করার যথাযথ উপায় (যা কাজ করে না) হ'ল: কেপ এবং অবজেক্ট উভয়কেই সংজ্ঞায়িত করা হয়েছে তা নিশ্চিত করতে REPL তে পেস্ট করুন।
স্টিফেনবোশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.