স্কালায় "নতুন" কীওয়ার্ড


96

আমার খুব সাধারণ প্রশ্ন আছে - স্কালায় অবজেক্ট তৈরি করার সময় আমাদের নতুন কীওয়ার্ডটি কখন প্রয়োগ করা উচিত? যখন আমরা কেবল জাভা অবজেক্টগুলি ইনস্ট্যান্ট করার চেষ্টা করি তখনই কি হয়?

উত্তর:


146

newআপনি যখন কোনও classনিজস্ব নির্মাণকারীর উল্লেখ করতে চান তখন কীওয়ার্ডটি ব্যবহার করুন :

class Foo { }

val f = new Foo

ফেরত newআপনি সহচর বস্তুর উল্লেখ করা হয় applyপদ্ধতি:

class Foo { }
object Foo {
    def apply() = new Foo
}

// Both of these are legal
val f = Foo()
val f2 = new Foo

যদি আপনি কেস ক্লাস করেন:

case class Foo()

স্কালা গোপনে আপনার জন্য একটি সহযোগী অবজেক্ট তৈরি করে এটি এটিকে রূপান্তরিত করে:

class Foo { }
object Foo {
    def apply() = new Foo
}

সুতরাং আপনি করতে পারেন

f = Foo()

শেষ অবধি, মনে রাখবেন যে এমন কোনও নিয়ম নেই যা বলছে যে সহযোগী apply পদ্ধতিটি নির্মাণকারীর জন্য প্রক্সি হতে হবে:

class Foo { }
object Foo {
    def apply() = 7
}

// These do different things
> println(new Foo)
test@5c79cc94
> println(Foo())
7

এবং, যেহেতু আপনি জাভা ক্লাসগুলি উল্লেখ করেছেন: হ্যাঁ - জাভা ক্লাসগুলিতে খুব কমই কোনও applyপদ্ধতির সহকর্মী অবজেক্ট থাকে তাই আপনাকে অবশ্যই ব্যবহার করতে হবে newএবং প্রকৃত শ্রেণির নির্মাতা।


4
জাভা ক্লাসে কখনই কোনও সহযোগী বস্তু থাকতে পারে না। এটিতে এমন কোনও বস্তু থাকতে পারে যা জাভা শ্রেণীর জন্য কারখানা হিসাবে কাজ করতে পারে - তবে এই বস্তুটি তার সহযোগী বস্তু নয়।
কিরিতসুকু

@ অ্যান্টোরাস যেহেতু স্কালার ক্লাসগুলি জাভা বাইটকোডে সংকলিত হয়েছে এবং সংকলিত আকারে বিতরণ করা যেতে পারে, স্কালা কি কোনও প্রকৃত স্কালার সঙ্গী এবং ফু-MO নামের একটি শ্রেণীর মধ্যে পার্থক্য বলতে পারে একটি স্থির মোডিয়ুল $ সদস্যের সাথে?
ওভেন

4
আমি মনে করি স্ক্যালাক এটিকে পৃথক করতে পারে কারণ এটি অনুমিত হয় যে কোনও সহযোগী বস্তুটিকে তার সহযোগী বর্গ হিসাবে একই ফাইলটিতে ঘোষণা করতে হবে। কারণ সঙ্গী "সম্পত্তি" কেবল স্কালায় বিদ্যমান এবং বাইটকোড-স্তরের স্ক্যালাককে নয় স্কালা কোডটি পরীক্ষা করতে হবে এবং বাইটকোডকে নয় যে অনুমানটি অনুসরণ করা হয়েছে তা নিশ্চিত করতে।
কিরিতসুকু

4
জাভা ক্লাসগুলির কোনও উদাহরণ যা স্কালায় নতুন কীওয়ার্ড ব্যবহার করে না?
Bober02

এছাড়াও ক্লাসে স্থির পদ্ধতিগুলির মাধ্যমে সহযাত্রী অবজেক্টের পদ্ধতিগুলি অ্যাক্সেসযোগ্য হয়ে উঠবে এবং জাভা ক্লাসগুলির সাথে এটি কখনই ঘটবে না যার জন্য আপনি পরে "সঙ্গী" সংজ্ঞায়িত করেন।
drexin

16

যখন আমরা কেবল জাভা বস্তুগুলিকে ইনস্ট্যান্ট করার চেষ্টা করি তখনই কি হয়?

একদমই না. আপনি স্কেলে বাদ দিলে দুটি সাধারণ কেস থাকে new। সিঙ্গেলটন বস্তুগুলির সাথে (যা প্রায়শই স্থির ফাংশনগুলি সংরক্ষণ করতে এবং আপনি জাভাতে দেখতে পারা যা একই রকম ফ্যাক্টরি হিসাবে ব্যবহৃত হয়):

scala> object LonelyGuy { def mood = "sad" }
defined module LonelyGuy

scala> LonelyGuy
res0: LonelyGuy.type = LonelyGuy$@3449a8

scala> LonelyGuy.mood
res4: java.lang.String = sad

একটি সঙ্গে কেস শ্রেণীর (আসলে নীচে সেখানে বর্গ অবজেক্ট = হয় সহচর প্যাটার্ন, যেমন থাকার বর্গ এবং বস্তুর একই নামের):

scala> case class Foo(bar: String) 
defined class Foo


scala> Foo("baz")
res2: Foo = Foo(baz)

সুতরাং আপনি যখন কোনও সাধারণ ক্লাস নিয়ে কাজ করেন, নিয়মগুলি জাভার মতোই।

scala> class Foo(val bar: String) 
defined class Foo

scala> new Foo("baz")
res0: Foo = Foo@2ad6a0

// will be a error 
scala> Foo("baz")
<console>:8: error: not found: value Foo
       Foo("baz")

বোনাস, স্কালায় একটি বেনাম শ্রেণি রয়েছে, যা এভাবে নির্মিত যেতে পারে:

scala> new { val bar = "baz" }
res2: java.lang.Object{val bar: java.lang.String} = $anon$1@10ee5b8

scala> res2.bar
res3: java.lang.String = baz

4
তুমি ঠিক আছে?
জ্যাকব বি

0

আমরা যখন কেবল জাভা অবজেক্টগুলিকে ইনস্ট্যান্ট করার চেষ্টা করি তখনই কি হয়?

স্কটি 3 দিয়ে (যা ২০২০ সালের মাঝামাঝি সময়ে প্রকাশ করা উচিত, আট বছর পরে) ডটিটির উপর ভিত্তি করে : কখনই নয়।

এই থ্রেডেরnew মতো স্ক্যালাল 3 " " নামবে

কোনও প্রয়োগ পদ্ধতি প্রয়োগ না করা সত্ত্বেও স্রষ্টা অ্যাপ্লিকেশনগুলি ক্লাসের উদাহরণ তৈরি করতে সাধারণ ফাংশন কল সিনট্যাক্স ব্যবহার করার অনুমতি দেয়।

উদাহরণ:

class StringBuilder(s: String) {
   def this() = this(s)
}

StringBuilder("abc")  // same as new StringBuilder("abc")
StringBuilder()       // same as new StringBuilder()

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

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