স্কালায় নাল / কিছুই না / ইউনিটের ব্যবহার


95

আমি সবেমাত্র পড়েছি: http://oldfashionedsoftware.com/2008/08/20/a-post-about-n কিছুই/

আমি যতদূর বুঝতে পারি, Nullএটি একটি বৈশিষ্ট্য এবং এর একমাত্র উদাহরণ null

যখন কোনও পদ্ধতি নাল আর্গুমেন্ট গ্রহণ করে, তখন আমরা কেবল এটি একটি Nullরেফারেন্স বা nullসরাসরি পাস করতে পারি তবে এটি অন্য কোনও রেফারেন্স নয়, এমনকি এটি নাল হলেও ( nullString: String = nullউদাহরণস্বরূপ)।

আমি শুধু ভাবছি কোন ক্ষেত্রে এই Nullবৈশিষ্ট্যটি ব্যবহার করা কার্যকর হতে পারে। এমন কিছুই নেই যা এর জন্য আমি আর কোনও উদাহরণ দেখি না।


আমি কিছুই বুঝতে পারি না যে রিটার্নের ধরণ হিসাবে কিছুই এবং ইউনিট ব্যবহার করার মধ্যে পার্থক্য কী, যেহেতু উভয়ই কোনও ফল দেয় না, উদাহরণস্বরূপ লগিং সম্পাদনকারী একটি পদ্ধতি থাকা অবস্থায় কোনটি ব্যবহার করব তা কীভাবে জানব?


আপনার কি ইউনিট / নাল / রিটার্নের ধরণের ব্যতীত অন্য কিছু হিসাবে ব্যবহার নেই?

উত্তর:


80

আপনি কেবল কিছুই ব্যবহার করেন না যদি পদ্ধতিটি কখনই ফিরে না আসে (অর্থাত্ এটি ফিরে আসার মাধ্যমে সাধারণত সম্পূর্ণ হতে পারে না, এটি একটি ব্যতিক্রম ছুঁড়ে দিতে পারে)। কিছুই কখনই তাত্ক্ষণিক হয় না এবং সেখানে টাইপ সিস্টেমের সুবিধার্থে নেই (জেমস আইরির উদ্ধৃতি দিতে: "স্কালার নীচের ধরণের কারণটি টাইপ প্যারামিটারগুলিতে তারতম্য প্রকাশের ক্ষমতাকে জড়িত।" ) আপনি নিবন্ধটি লিঙ্ক করেছেন:

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

আপনার লগিং পদ্ধতি ইউনিট ফিরে আসবে। একটি মান ইউনিট রয়েছে যাতে এটি আসলে ফিরে আসতে পারে। থেকে এপিআই ডক্স :

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


4
ধন্যবাদ, "কখনই ফিরে আসে না" এর অর্থ কি আপনি বোঝাতে চেয়েছেন যে কলটি অনির্দিষ্টকালের জন্য অবরুদ্ধ হচ্ছে (কাজের সময়সূচীর সূচনা পদ্ধতির উদাহরণ হিসাবে?)
সেবাস্তিয়ান লরবার

4
@ সাবস্টিয়ান: এটি সাধারণত ফিরে আসে না, এটি একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে ( জেমস-অরি.ব্লগস্পট . com/2009/08/… দেখুন )। যদি ব্লকিং কলটি কেবল একটি ব্যতিক্রম ছুঁড়ে শেষ হয় তবে তা গণনা করা হবে। প্রশ্নের জন্য ধন্যবাদ, এই স্পষ্ট করা প্রয়োজন।
নাথান হিউজেস

18

আপনি যে নিবন্ধটি উদ্ধৃত করেছেন তা বিভ্রান্তিমূলক হতে পারে। Nullটাইপ সাথে সামঞ্জস্যের জন্য আছে জাভা ভার্চুয়াল মেশিন এবং বিশেষ করে জাভা।

আমাদের অবশ্যই এটি স্কেলা বিবেচনা করতে হবে :

  • সম্পূর্ণ অবজেক্ট ওরিয়েন্টেড: প্রতিটি মান একটি বস্তু
  • দৃ strongly়ভাবে টাইপ করা হয়েছে: প্রতিটি মানের একটি প্রকার থাকতে হবে
  • nullঅ্যাক্সেসের জন্য রেফারেন্সগুলি হ্যান্ডেল করা দরকার , উদাহরণস্বরূপ, জাভা লাইব্রেরি এবং কোড

সুতরাং nullমানটির জন্য কোনও ধরণের সংজ্ঞা দেওয়া প্রয়োজন , যা Nullবৈশিষ্ট্য এবং nullএটির একমাত্র উদাহরণ রয়েছে।

Nullআপনি টাইপ-সিস্টেম না হয়ে বা আপনি সংকলকটির বিকাশ না করে টাইপটিতে বিশেষত কার্যকর কিছু নেই । বিশেষত আমি Nullকোনও পদ্ধতির জন্য টাইপ প্যারামিটার সংজ্ঞায়নের কোনও বুদ্ধিমান কারণ দেখতে পাচ্ছি না , যেহেতু আপনি ছাড়া আর কিছু পাস করতে পারবেন নাnull


এটি সত্য, তাই শেষ পর্যন্ত নুলের অন্য কোনও ব্যবহার নেই?
সেবাস্তিয়ান লরবার

উত্তর সেবাস্তিয়ানলবার উত্তর সম্পাদনা করেছেন। আমি গড় বিকাশকারীর জন্য আসলে কোনও ব্যবহার দেখতে পাচ্ছি না। হতে পারে অন্য কেউ দরকারী কিছু ভাবতে পারেন।
প্যাগোডা_৫ বি

এর জন্য ধন্যবাদ. যদি আমরা এই ধরণের জিনিসগুলির কারণ জানি তবে আমরা সেগুলি বুঝতে পারি, অন্যথায় আমরা সেগুলি স্মরণ করি।
Sreekar

নাল দরকারী যখন আপনার একটি টাইপ প্যারামিটার থাকে এবং এই প্রশ্ন এবং উত্তর মতো নাল ফিরে আসতে পারে , যেহেতু আপনার স্ক্যালতে নাল ব্যবহার করা থেকে নিরুৎসাহিত করা এটি খুব কমই সামনে আসে যদিও টাইপ সিস্টেমে অন্যান্য ব্যবহারগুলিও থাকতে পারে
ড্যানিয়েল কার্লসন

15

আপনার কি ইউনিট / নাল / রিটার্নের ধরণের ব্যতীত অন্য কিছু হিসাবে ব্যবহার নেই?


Unit এটি ব্যবহার করা যেতে পারে:

def execute(code: => Unit):Unit = {
  // do something before
  code
  // do something after
}

এটি আপনাকে কার্যকর করার জন্য কোডের একটি স্বেচ্ছাসেবী ব্লকে পাস করতে দেয়।


Nullনীচের যে কোনও মানের জন্য নীচের প্রকার হিসাবে ব্যবহার করা যেতে পারে ul একটি উদাহরণ এটি:

implicit def zeroNull[B >: Null] =
    new Zero[B] { def apply = null }

Nothing সংজ্ঞা ব্যবহৃত হয় None

object None extends Option[Nothing]

এটি আপনাকে যে Noneকোনও প্রকারের জন্য একটি বরাদ্দ করতে দেয় Optionকারণ Nothingসবকিছু 'প্রসারিত' করে।

val x:Option[String] = None

ঠিক আছে. ইউনিটটি ব্যবহারের জন্য আপনি জেনেরিক প্রকারটি ব্যবহার করতে পারতেন যাতে আপনার কোড ব্লক ইউনিট ব্যতীত অন্য কোনও কিছু ফেরত দিলে নির্বাহকারী এই জেনেরিক প্রকারটি ফিরিয়ে দিতে পারে।
সেবাস্তিয়ান লরবার

@ ড্রেক্সিন যেমন অন্য উত্তরে একটি মন্তব্যে বলেছিলেন, এটি বেশিরভাগই পার্শ্ব প্রতিক্রিয়া বোঝাতে ব্যবহৃত হয়।
EECOLOR

6

আপনি যদি ব্যবহার Nothingকরেন তবে কিছু করার নেই (মুদ্রণ কনসোল অন্তর্ভুক্ত) যদি আপনি কিছু করেন তবে আউটপুট টাইপ ব্যবহার করুনUnit

object Run extends App {
  //def sayHello(): Nothing = println("hello?")
  def sayHello(): Unit = println("hello?")
  sayHello()
}

... তাহলে কীভাবে ব্যবহার করব Nothing?

trait Option[E]
case class Some[E](value: E) extends Option[E]
case object None extends Option[Nothing]

4
এছাড়াও, Eমধ্যে Optioncovariant অবস্থানে ফিরে আসে: trait Option[+E]অনুমতি ভালো জিনিসval x: Option[Int] = None
তেজ

5

আমি আসলে Nullটাইপটি কখনই ব্যবহার করি নি , তবে আপনি ব্যবহার করুন Unitযেখানে আপনি জাভা ব্যবহার করবেন voidNothingএকটি বিশেষ ধরণের, কারণ নাথান যেমন ইতিমধ্যে উল্লেখ করেছেন, এর কোনও উদাহরণ নেই NothingNothingএটি একটি তথাকথিত নীচের ধরণের, যার অর্থ এটি অন্য যে কোনও ধরণের উপ-প্রকার। এটি (এবং বিপরীতমুখী ধরণের পরামিতি) এজন্য আপনি যে কোনও মান Nil- যা একটি List[Nothing]- এবং যে তালিকাটি এই উপাদানগুলির ধরণের হবে তা প্রিনড করতে পারেন । Noneটাইপ যদি Option[Nothing]। এই ধরণের পাত্রে অভ্যন্তরের মানগুলিতে অ্যাক্সেসের প্রতিটি প্রচেষ্টা একটি ব্যতিক্রম ছুঁড়ে ফেলবে, কারণ এটি কোনও ধরণের পদ্ধতি থেকে ফিরে আসার একমাত্র বৈধ উপায় Nothing


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

ইউনিট ব্যবহার করা হয়, যেখানে পার্শ্ব প্রতিক্রিয়া দেখা দেয়, উদাহরণস্বরূপ আইও মোনাড IO[Unit]কনসোল এবং প্রিন্টে মুদ্রণের জন্য টাইপ হতে পারে ।
drexin

হ্যাঁ, কখনও আইও মোনাড ব্যবহার করেনি এটি ইউনিটের সাথে এটি ব্যবহার করে বোঝা যায় (এবং এটি কোনও আইও অপারেশন যা কোনও অসীম প্রবাহ তৈরি করে তা যদি কিছুই হয় না?)
সেবাস্তিয়ান লরবার

না, কিছুই সেখানে বোঝা যায় না।
drexin

3

কিছুই প্রায়শই স্পষ্টভাবে ব্যবহার করা হয় না । নিচের কোড ইন, অন্য দফা ধরনের হয় কিছুই , যা বুলিয়ান একটি উপশ্রেণী (সেইসাথে অন্য কোন AnyVal) হয়। সুতরাং, সম্পূর্ণ অ্যাসাইনমেন্টটি সংকলকটির জন্য বৈধ, যদিও অন্য ধারাটি আসলে কিছু দেয় না।val b: Boolean = if (1 > 2) false else throw new RuntimeException("error")


1

এর Nothingথেকে একটি উদাহরণ এখানে scala.predef:

  def ??? : Nothing = throw new NotImplementedError

আপনি যদি অপরিচিত হন (এবং সার্চ ইঞ্জিনগুলি এটি সন্ধান করতে পারে না) ???এমন কোনও কিছুর জন্য এখনও স্কেলার স্থানধারক ফাংশন যা এখনও প্রয়োগ করা হয়নি। কোটলিনের মতোই TODO

মক অবজেক্ট তৈরি করার সময় আপনি একই কৌশলটি ব্যবহার করতে পারেন: কাস্টম notUsedপদ্ধতিতে অব্যবহৃত পদ্ধতিগুলিকে ওভাররাইড করুন । ব্যবহার না করার সুবিধা ???হ'ল আপনি যে বিষয়গুলি প্রয়োগ করার ইচ্ছা করেন না সেগুলির জন্য সংকলন সতর্কতা পাবেন না।


0

বিষয়শ্রেণীতে তত্ত্ব নিরিখে কিছুই একটি হল প্রাথমিক বস্তু এবং ইউনিট একটি হল টার্মিনাল বস্তুর

https://en.wikedia.org/wiki/Initial_and_terminal_objects

প্রাথমিক বস্তুগুলিকে coterminal বা সর্বজনীন বলা হয় , এবং টার্মিনাল অবজেক্টগুলিকে চূড়ান্তও বলা হয় ।

যদি কোনও বস্তু প্রাথমিক এবং টার্মিনাল উভয় হয় তবে এটিকে শূন্য বস্তু বা নাল বস্তু বলা হয়।

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