স্কালে '20 সেকেন্ড 'কীভাবে কাজ করে?


130

নিম্নলিখিতটি কীভাবে সংকলন করে:

import scala.concurrent.duration._

val time = 20 seconds

আসলে এখানে কি চলছে?

উত্তর:


171

কিছু জিনিস চলছে।

প্রথমত, স্কালা বহু পদ্ধতি কল থেকে বিন্দু এবং পেরেনগুলি বাদ দিতে দেয়, তাই * এর 20 secondsসমতুল্য 20.seconds()

দ্বিতীয়ত, একটি "অন্তর্নিহিত রূপান্তর" প্রয়োগ করা হয়। যেহেতু 20একটি হল Intএবং Intকোন হয়েছে secondsপদ্ধতি, একটি অন্তর্নিহিত রূপান্তর যে লাগে জন্য কম্পাইলার অনুসন্ধান Intএবং আয় কিছু আছে একটি secondsঅনুসন্ধান আপনার পদ্ধতি কল সুযোগ দ্বারা সীমাবদ্ধ সঙ্গে পদ্ধতি।

আপনি নিজের সুযোগে সময়কালীন আমদানি করেছেন । যেহেতু প্যারামিটার DurationIntসহ একটি অন্তর্ভুক্ত শ্রেণি Int, তাই এর নির্মাতা একটি অন্তর্নিহিত Int => DurationIntরূপান্তর সংজ্ঞায়িত করে । DurationIntএকটি secondsপদ্ধতি আছে, সুতরাং এটি অনুসন্ধানের সমস্ত মানদণ্ডকে সন্তুষ্ট করে। অতএব, সংকলকটি আপনার কলকে new DurationInt(20).seconds** হিসাবে পুনরায় লিখবে।

* আমি এটিকে শিথিলভাবে বলতে চাইছি। 20.seconds()প্রকৃতপক্ষে অবৈধ কারণ secondsপদ্ধতির কোনও প্যারামিটারের তালিকা নেই এবং সেইজন্য পদ্ধতি কলটিতে প্যারেনগুলি বাদ দিতে হবে।

** প্রকৃতপক্ষে, এটি একেবারেই সত্য নয় কারণ DurationIntএকটি মান শ্রেণি, তাই সংকলক যদি সম্ভব হয় তবে পূর্ণসংখ্যা মোড়ানো এড়াতে পারে।


83
যেকোন পর্যাপ্ত উন্নত প্রযুক্তি ম্যাজিক থেকে আলাদা নয়।
ripper234

4
ভাগ্যক্রমে বেশিরভাগ আইডিই এটির পার্থক্য করতে সক্ষম! অন্তর্নিহিত রূপান্তরগুলি স্কালায় যথেষ্ট ব্যবহৃত হয়। আপনি যদি কেবল পাঠ্য ফাইলটি পড়ছেন তবে এটি বিভ্রান্তিকর হতে পারে ("সেই পদ্ধতিটি কোথা থেকে আসে") তবে উপযুক্ত সরঞ্জাম সহায়তার সাহায্যে আপনার চারপাশের পথটি সন্ধান করতে সক্ষম হওয়া উচিত, যেখানে স্কালা সুন্দর অর্থবহ এবং সংক্ষিপ্ত হতে পারে। (উদাহরণস্বরূপ, 20. সেকেন্ডগুলি new DurationInt(20).seconds()এটির কীভাবে আপনি জানেন ততদিনের চেয়ে অনেক বেশি পঠনযোগ্য )
উইলিয়াম বিলিংসলে

1
যদি আপনি নিজেকে জড়িত ব্যবহার করে খুঁজে পান তবে সর্বদা নিজেকে জিজ্ঞাসা করুন যদি তাদের সাহায্য ছাড়াই একই জিনিস অর্জন করার কোনও উপায় আছে কিনা। twitter.github.com/effectivescala/# টিপস এবং জেনেরিক্স-
ইমপ্লিটস

4
প্রকৃতপক্ষে secondsপদ্ধতিটি পেরেন ছাড়াই সংজ্ঞায়িত করা হয়েছে, সুতরাং প্যারেন্সের সাথে এটি কল করা একটি ত্রুটি।
ফ্রাঙ্ক এস থমাস

1
@ ফ্র্যাঙ্ক এটি একটি ভাল পয়েন্ট। আমি বলতে চাইনি যে আপনি 20.seconds()স্কালায় লিখতে পারেন , কেবল যে সংকলক কলটি সেইভাবে অনুবাদ করছে। এটি উল্লেখ করার মতো যে যদি সম্পর্কিত পদ্ধতিটির কোনও পরামিতি তালিকা না থাকে তবে স্কালার জন্য আপনাকে প্যারেনগুলি বাদ দিতে হবে।
অ্যারন নভস্ট্রাপ

7

সেখানে যে "যাদু" চলছে, তাকে "অন্তর্নিহিত রূপান্তর" বলা হয়। আপনি অন্তর্নিহিত রূপান্তরগুলি আমদানি করছেন এবং তাদের মধ্যে কয়েকজন সময়কালে ইন্টার (এবং ডাবল) এর মধ্যে রূপান্তর পরিচালনা করে। এটাই আপনি কাজ করছেন।


1
কোনও ধারণা কেন আমদানি import scala.concurrent.duration._সমাধান করে 20 secondsতবে প্রকৃতপক্ষে ট্রেইটটি আমদানি করা DurationConversionsহয় না কেন? সম্পাদনা : তারা আসলে কী আমদানি করছে তা ঠিক উপলব্ধি করে DurationInt। আমি অনুমান করছি এটি কারণ আপনি প্রকৃত বৈশিষ্ট্যটি আমদানি করতে পারবেন না? কেবলমাত্র বৈশিষ্ট্যটির একটি দৃ concrete় বাস্তবায়ন?
খোলাখুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.