আপনি যখন প্রথম বন্ধনী, বিন্দু, ধনুর্বন্ধনী, = (ফাংশন) ইত্যাদি বাদ দিতে পারেন তার জন্য সুনির্দিষ্ট বিধিগুলি কী?


106

আপনি যখন (বন্ধ) বন্ধনী, বিন্দু, ধনুর্বন্ধনী, = (ফাংশন), ইত্যাদি বাদ দিতে পারেন তার সুনির্দিষ্ট বিধিগুলি কী?

উদাহরণ স্বরূপ,

(service.findAllPresentations.get.first.votes.size) must be equalTo(2).
  • service আমার উদ্দেশ্য
  • def findAllPresentations: Option[List[Presentation]]
  • votes আয় List[Vote]
  • অবশ্যই এবং হতে চশমা উভয় ফাংশন হয়

আমি কেন যেতে পারি না:

(service findAllPresentations get first votes size) must be equalTo(2)

?

সংকলক ত্রুটিটি হ'ল:

"রেস্টস সার্ভিসসপেকটস্ট.থিস.সার্ভিস.ফাইন্ডএল সমস্ত প্রকারের প্রকারের বিকল্পের [তালিকা [com.sharca.Pferencesation]] পরামিতি নেয় না"

কেন মনে হচ্ছে আমি একটি প্যারামিটারে পাস করার চেষ্টা করছি? আমাকে কেন প্রতিটি পদ্ধতি কলের জন্য বিন্দু ব্যবহার করতে হবে?

কেন (service.findAllPresentations get first votes size)সমান হতে হবে (2) ফলাফল:

"পাওয়া যায় নি: প্রথম মান"

তবুও, "অবশ্যই সমান হতে হবে 2" এর (service.findAllPresentations.get.first.votes.size)সমান হতে হবে 2, অর্থাৎ, পদ্ধতি শৃঙ্খলা ঠিকঠাক কাজ করে? - অবজেক্ট চেইন চেইন চেইন পরম।

আমি স্কালা বই এবং ওয়েবসাইট দেখেছি এবং সত্যিই এর বিস্তৃত ব্যাখ্যা খুঁজে পাচ্ছি না।

বাস্তবে কি রব এইচ স্ট্যাক ওভারফ্লো প্রশ্নে ব্যাখ্যা করেছেন আমি স্ক্যালায় কোন চরিত্র বাদ দিতে পারি? , যে '' বাদ দেওয়ার জন্য একমাত্র বৈধ ব্যবহার-কেস। "অপারেন্ড অপারেটর অপারেন্ড" স্টাইল অপারেশনগুলির জন্য, এবং পদ্ধতি শৃঙ্খলার জন্য নয়?

উত্তর:


87

আপনি উত্তরটি হোঁচট খেয়েছেন বলে মনে হচ্ছে। যাইহোক, আমি এটি পরিষ্কার করার চেষ্টা করব।

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

এখন, অপারেটর স্বরলিপি হল মেথড-কলের জন্য একটি স্বরলিপি , যার অর্থ এটি কল করা হচ্ছে এমন অবজেক্টের অনুপস্থিতিতে ব্যবহার করা যাবে না।

আমি সংক্ষিপ্ত বিবরণ বিবরণ করব।

উপসর্গ:

শুধু ~, !, +এবং -উপসর্গ স্বরলিপি ব্যবহার করা যাবে। আপনি লেখার সময় !flagবা আপনি যখন এটি ব্যবহার করছেন তখন এটি স্বরলিপি val liability = -debt

পোতা:

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

পোস্টফিক্স (প্রত্যয়ও):

পদ্ধতিটি কোনও অবজেক্টকে অনুসরণ করে এবং কোনও পরামিতি না পেলে সেই স্বরলিপিটি ব্যবহৃত হয় । উদাহরণস্বরূপ, আপনি লিখতে পারেন list tail, এবং এটি পোস্টফিক্স স্বরলিপি।

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

(list
 filter (...)
 map (...)
 mkString ", "
)

এটি একই জিনিস:

list filter (...) map (...) mkString ", "

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

আপনি একাধিক পরামিতি সহ ইনফিক্স ব্যবহার করতে পারেন:

string substring (start, end) map (_ toInt) mkString ("<", ", ", ">")

ত্রিযুক্ত ফাংশনগুলি ইনফিক্স স্বরলিপি সহ ব্যবহার করা শক্ত। ভাঁজ ফাংশনগুলি এর একটি সুস্পষ্ট উদাহরণ:

(0 /: list) ((cnt, string) => cnt + string.size)
(list foldLeft 0) ((cnt, string) => cnt + string.size)

ইনফিক্স কলের বাইরে আপনার প্রথম বন্ধনী ব্যবহার করা দরকার। আমি এখানে খেলতে সঠিক নিয়ম নিশ্চিত নই।

এখন, পোস্টফিক্স সম্পর্কে কথা বলা যাক। পোস্টফিক্সটি ব্যবহার করা শক্ত হতে পারে, কারণ এটি কোনও এক্সপ্রেশনের শেষ ব্যতীত আর কোথাও ব্যবহার করা যায় না । উদাহরণস্বরূপ, আপনি নিম্নলিখিতগুলি করতে পারবেন না:

 list tail map (...)

কারণ লেজটি প্রকাশের শেষে উপস্থিত হয় না। আপনি এটিও করতে পারবেন না:

 list tail length

আপনি এক্সপ্রেশন এর শেষ চিহ্নিত করতে প্রথম বন্ধনী ব্যবহার করে ইনফিক্স স্বরলিপি ব্যবহার করতে পারেন:

 (list tail) map (...)
 (list tail) length

নোট করুন যে পোস্টফিক্স সংকেত নিরুৎসাহিত করা হয়েছে কারণ এটি অনিরাপদ হতে পারে

আমি আশা করি এটি সমস্ত সন্দেহ দূর করেছে। যদি তা না হয় তবে একটি মন্তব্য রেখে দিন এবং আমি এটি উন্নতি করতে কী করতে পারি তা দেখতে পাচ্ছি।


আহ, সুতরাং আপনি আমার বিবৃতিতে বলছেন: ((((রিয়েলসেসার্স সন্ধানআলপ্রেজিশনগুলি) প্রথম) ভোট) আকার) সমান হতে হবে 2 - প্রাপ্তি, প্রথম, ভোট এবং আকার সমস্ত পোস্টফিক্স অপারেটর, কারণ তারা কোনও প্যারামিটার নেয় না ? তাই আমি ভাবছি কি হওয়া উচিত, সমান এবং সমান ...
অ্যান্টনি স্টাবস

আমি বাছাইয়ের কিছুই বলছি না, যদিও আমি বেশ নিশ্চিত যে এটি অবশ্যই হবে। :-) সিনট্যাক্স প্রিটিয়ের তৈরির জন্য "হতে" সম্ভবত একটি সহায়ক অবজেক্ট। অথবা, আরও নির্দিষ্টভাবে, "অবশ্যই" দিয়ে ইনফিক্স নোটেশনের ব্যবহার সক্ষম করতে।
ড্যানিয়েল সি সোব্রাল

ওয়েল গেট ইজ অপশন.জেট, ফার্স্ট লিস্ট.ফার্স্ট, ভোট হ'ল কেস শ্রেণির সম্পত্তি এবং আকার হ'ল list.size। আপনি এখন কি চিন্তা করছেন?
অ্যান্টনি স্টাবস

হ্যাঁ হ্যাঁ - এগুলি "(রিয়েলসেসার্স ফাইন্ডপ্রেজিশন 1) .get.id অবশ্যই সমান হতে হবে" কাজ করে - যেমন সার্ভিস # সন্ধানপ্রেমেশন (আইডি: ইন্ট) এটি একটি ইনফিক্স অপারেটর বলে মনে হয়। শীতল - আমি এখন এটি পেয়েছি বলে মনে করি। :)
অ্যান্টনি স্টাবস

42

শ্রেণীর সংজ্ঞা:

valবা varক্লাস প্যারামিটারগুলি থেকে বাদ দেওয়া যেতে পারে যা প্যারামিটারটিকে ব্যক্তিগত করে তুলবে।

ভের বা ভ্যাল যোগ করার ফলে এটি সর্বজনীন হতে পারে (অর্থাত্ পদ্ধতি অ্যাকসেসর এবং মিউটরগুলি উত্পন্ন হয়)।

{} যদি শ্রেণীর কোনও দেহ না থাকে, তবে তা বাদ দেওয়া যেতে পারে,

class EmptyClass

ক্লাস ইনস্ট্যান্টেশন:

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

class D[T](val x:T, val y:T);

এটি আপনাকে একটি টাইপ ত্রুটি দেবে (Int পাওয়া গেছে, প্রত্যাশিত স্ট্রিং)

var zz = new D[String]("Hi1", 1) // type error

যদিও এটি কাজ করে:

var z = new D("Hi1", 1)
== D{def x: Any; def y: Any}

কারণ প্যারামিটার, টি, দুটি - যেকোন, এর মধ্যে সর্বনিম্ন সাধারণ সুপারটাইপ হিসাবে অনুমান করা হয়।


ফাংশন সংজ্ঞা:

= যদি ফাংশনটি ইউনিটটি (কিছু না) দেয় তবে বাদ দেওয়া যাবে।

{}যদি ফাংশনটি একক বিবৃতি হয় তবে ফাংশনটির বডি বাদ দেওয়া যেতে পারে, তবে কেবলমাত্র বিবৃতিটি কোনও মান (আপনার =সাইন দরকার ) প্রত্যাবর্তন করলেই ,

def returnAString = "Hi!"

তবে এটি কাজ করে না:

def returnAString "Hi!" // Compile error - '=' expected but string literal found."

ফাংশনটির রিটার্ন টাইপ বাদ দেওয়া যেতে পারে যদি এটি অনুমান করা যায় (একটি পুনরাবৃত্ত পদ্ধতিতে তার রিটার্নের ধরণ নির্দিষ্ট থাকতে হবে)।

() যদি ফাংশনটি কোনও যুক্তি না নেয় তবে বাদ দেওয়া যেতে পারে,

def endOfString {
  return "myDog".substring(2,1)
}

যা কনভেনশন দ্বারা এমন কোনও পদ্ধতির জন্য সংরক্ষিত রয়েছে যার কোনও পার্শ্ব প্রতিক্রিয়া নেই - পরে এটি আরও।

()নাম প্যারাম্যান্টারের দ্বারা পাস সংজ্ঞায়িত করার সময় আসলে সে প্রতি ছাড়েনি, তবে এটি আসলে একটি সম্পূর্ণ শব্দার্থভাবে আলাদা স্বরলিপি, এটি হ'ল

def myOp(passByNameString: => String)

বলছেন যে MyOp একটি পাস-বাই-প্যারামিটার নেয়, যার ফলস্বরূপ ফাংশন পরামিতিগুলির বিপরীতে স্ট্রিংয়ের (অর্থাৎ এটি একটি কোড ব্লক হতে পারে যা একটি স্ট্রিং ফিরিয়ে দেয়) ফলাফল করে,

def myOp(functionParam: () => String)

যা বলে যে myOpএকটি ফাংশন নেয় যা শূন্য পরামিতি রয়েছে এবং একটি স্ট্রিং প্রদান করে।

(মনে মনে, পাস-বাই-প্যারামিটারগুলি ফাংশনগুলিতে সংকলিত হয়; এটি কেবল সিনট্যাক্সকে আরও সুন্দর করে তোলে))

() যদি ফাংশনটি কেবল একটি যুক্তি নেয় তবে ফাংশন প্যারামিটার সংজ্ঞাতে ফেলে দেওয়া যেতে পারে, উদাহরণস্বরূপ:

def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
def myOp2(passByNameString:Int => String) { .. }

তবে যদি এটি একাধিক যুক্তি লাগে তবে আপনাকে অবশ্যই ():

def myOp2(passByNameString:(Int, String) => String) { .. }

বিবৃতি:

.অপারেটর স্বরলিপি ব্যবহার করতে বাদ দেওয়া যেতে পারে, যা কেবল ইনফিক্স অপারেটরগুলির জন্য ব্যবহার করা যেতে পারে (পদ্ধতিগুলির অপারেটরগুলি যেগুলি আর্গুমেন্ট গ্রহণ করে)। দেখুন দানিয়েলের উত্তর আরও তথ্যের জন্য।

  • . পোস্টফিক্স ফাংশন তালিকার লেজের জন্যও বাদ দেওয়া যেতে পারে

  • () পোস্টফিক্স অপারেটরদের তালিকার জন্য বাদ দেওয়া যেতে পারে ail

  • () হিসাবে সংজ্ঞায়িত পদ্ধতি ব্যবহার করা যাবে না:

    def aMethod = "hi!" // Missing () on method definition
    aMethod // Works
    aMethod() // Compile error when calling method

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

  • () একক যুক্তিতে পাস করার পরে অপারেটর স্বরলিপিটির জন্য বাদ দেওয়া যেতে পারে

  • () পোস্টফিক্স অপারেটরগুলি ব্যবহারের প্রয়োজন হতে পারে যা কোনও বিবৃতি শেষে নেই

  • () নেস্টেড বিবৃতি, বেনামে ফাংশনগুলির সমাপ্তি বা অপারেটরগুলির জন্য যা একাধিক প্যারামিটার নেয় তার জন্য প্রয়োজন হতে পারে

একটি ফাংশন যা কোনও ফাংশনকে কল করার সময়, আপনি অভ্যন্তরীণ ফাংশন সংজ্ঞা থেকে () বাদ দিতে পারবেন না, উদাহরণস্বরূপ:

def myOp3(paramFunc0:() => String) {
    println(paramFunc0)
}
myOp3(() => "myop3") // Works
myOp3(=> "myop3") // Doesn't work

কোনও নাম-প্যারামিটার নিয়ে যাওয়া কোনও ফাংশন কল করার সময়, আপনি আর্গুমেন্টটিকে প্যারামিটার-কম বেনাম ফাংশন হিসাবে নির্দিষ্ট করতে পারবেন না। উদাহরণস্বরূপ, প্রদত্ত:

def myOp2(passByNameString:Int => String) {
  println(passByNameString)
}

আপনি এটি হিসাবে কল করতে হবে:

myOp("myop3")

অথবা

myOp({
  val source = sourceProvider.source
  val p = myObject.findNameFromSource(source)
  p
})

কিন্তু না:

myOp(() => "myop3") // Doesn't work

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

(ঠিক আছে, আরও সম্পূর্ণ, সংক্ষিপ্ত উত্তর সংকলনের সন্ধানে (আমি যদি কিছু মিস করেছি, বা ভুল কিছু পেয়েছি / অনুগ্রহ করে মন্তব্য করুন)), আমি উত্তরের শুরুতে যুক্ত করেছি Please দয়া করে নোট করুন এটি কোনও ভাষা নয় স্পেসিফিকেশন, সুতরাং আমি এটিকে একাডেমিকভাবে সঠিকভাবে তৈরি করার চেষ্টা করছি না - আরও একটি রেফারেন্স কার্ডের মতো))


10
আমি কাঁদছি. এটা কি.
প্রোফ্যাটাচ

12

বিভিন্ন শর্তে অন্তর্দৃষ্টি দেওয়ার উদ্ধৃতিগুলির একটি সংকলন ...

ব্যক্তিগতভাবে, আমি ভেবেছি স্পেসিফিকেশন আরও আছে। আমি নিশ্চিত যে অবশ্যই সেখানে থাকতে হবে, আমি ঠিক সঠিক শব্দগুলির সন্ধান করছি না ...

তবে বেশ কয়েকটি সূত্র রয়েছে এবং আমি সেগুলি একত্রিত করেছি, তবে সত্যিই সম্পূর্ণ / বিস্তৃত / বোধগম্য / যা আমার কাছে উপরের সমস্যাগুলি ব্যাখ্যা করে ...

"যদি কোনও পদ্ধতির শরীরে একাধিক এক্সপ্রেশন থাকে তবে আপনাকে অবশ্যই এটি কোঁকড়া ধনুর্বন্ধনী with ...। দিয়ে ঘিরে থাকতে হবে method

অধ্যায় 2 থেকে , "কম টাইপ করুন, আরও কিছু করুন" এরপ্রোগ্রামিং স্কালার:

"উপরের পদ্ধতির দেহটি সমান চিহ্ন '=' এর পরে আসে Why সমান চিহ্নটি কেন? জাভির মতো কেবল কোঁকড়ানো ধনুর্বন্ধনী not…} কেন? সেমিকোলনস, ফাংশন রিটার্নের ধরণ, পদ্ধতি আর্গুমেন্টের তালিকা এবং এমনকি কোঁকড়ানো ধনুর্বন্ধনী কখনও কখনও বাদ দেওয়া হয়, সমান চিহ্ন ব্যবহার করে বিভিন্ন সম্ভাব্য পার্সিং অস্পষ্টতা রোধ করে। সমান চিহ্নটি ব্যবহার করে আমাদের মনে করিয়ে দেয় যে এমনকি স্ক্যালায় ফাংশনগুলি মান রয়েছে যা স্কালার কার্যকরী প্রোগ্রামিংয়ের সমর্থনের সাথে সামঞ্জস্যপূর্ণ, অধ্যায় 8, ফাংশনাল প্রোগ্রামিংয়ে আরও বিশদে বর্ণিত scala। "

থেকে , এর: অধ্যায় 1, "Scala পেশ করা হচ্ছে জিরো ষাট থেকে" Scala প্রোগ্রামিং :

"কোন প্যারামিটার সহ একটি ফাংশন প্রথম বন্ধনী ছাড়াই ঘোষণা করা যেতে পারে, এক্ষেত্রে এটি অবশ্যই কোনও বন্ধনী ছাড়াই ডেকে আনতে হবে This এটি ইউনিফর্ম অ্যাক্সেস নীতিমালার পক্ষে সমর্থন সরবরাহ করে, যেমন কলার জানেন না যে প্রতীকটি পরিবর্তনশীল বা কোনও ফাংশন নেই কিনা cal প্যারামিটার।

ফাংশন বডিটি "=" এর আগে হয় যদি এটি কোনও মান দেয় (যেমন রিটার্নের ধরণ ইউনিট ব্যতীত অন্য কিছু হয়) তবে প্রকারটি ইউনিট হওয়ার সময় রিটার্নের ধরণ এবং "=" বাদ দেওয়া যেতে পারে (যেমন এটি কোনও পদ্ধতির মতো দেখায়) হিসাবে একটি ফাংশন বিরোধী)।

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

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

এবং যেহেতু আপনি বন্ধনী ব্যবহার করতে পারেন যেখানেই আপনি বন্ধনী ব্যবহার করতে পারেন, আপনি বিন্দু বাদ দিতে এবং ব্রেসগুলি রাখতে পারেন, এতে একাধিক বিবৃতি থাকতে পারে।

কোনও যুক্তি ছাড়াই ফাংশনগুলি প্রথম বন্ধনী ছাড়া কল করা যায়। উদাহরণস্বরূপ, স্ট্রিংয়ের দৈর্ঘ্য () ফাংশনটিকে "abc"। দৈর্ঘ্য () পরিবর্তে "abc"। দৈর্ঘ্য হিসাবে ডাকা যেতে পারে। যদি ফাংশনটি কোনও বন্ধনী ছাড়াই সংজ্ঞায়িত স্কাল ফাংশন হয়, তবে ফাংশনটি প্রথম বন্ধনী ছাড়াই কল করা উচিত।

কনভেনশন অনুসারে, প্রিন্টলনের মতো পার্শ্ব প্রতিক্রিয়াযুক্ত কোনও যুক্তিযুক্ত ফাংশনগুলিকে প্রথম বন্ধনী হিসাবে ডাকা হয়; পার্শ্ব প্রতিক্রিয়াবিহীনদেরকে প্রথম বন্ধনী ছাড়াই ডাকা হয় "

ব্লগ পোস্ট স্কাল সিনট্যাক্স প্রাইমার থেকে :

"পদ্ধতি সংজ্ঞাটি একটি ফাংশন সংজ্ঞা যেখানে ফলাফলের ধরণ এবং সমান চিহ্নটি বাদ দেওয়া হয়; এর সংজ্ঞায়িত এক্সপ্রেশনটি অবশ্যই একটি ব্লক হতে হবে Eg }।

উদাহরণ ৪.6.৩ এখানে লেখার নামকরণের একটি পদ্ধতি এবং একটি বিবৃতি দেওয়া আছে:

trait Writer {
    def write(str: String)
}
object Terminal extends Writer {
    def write(str: String) { System.out.println(str) }
}

উপরের কোডটি নিখুঁতভাবে নিম্নলিখিত কোডটিতে পূর্ণ হয়েছে:

trait Writer {
    def write(str: String): Unit
}
object Terminal extends Writer {
    def write(str: String): Unit = { System.out.println(str) }
}"

ভাষার স্পেসিফিকেশন থেকে:

"এমন পদ্ধতিগুলির সাথে যা কেবলমাত্র একটি একক প্যারামিটার নেয়, স্কালা বিকাশকারীকে একটি স্থান দিয়ে পুনরায় প্রতিস্থাপন করতে এবং আমাদের সন্নিবেশ অপারেটরের উদাহরণটিতে প্রদর্শিত অপারেটর সিনট্যাক্স সক্ষম করে, স্কেল এপিআইতে অন্য জায়গাগুলিতে যেমন ব্যবহার করা হয় যেমন পরিসীমা উদাহরণগুলি নির্মাণ হিসাবে:

val firstTen:Range = 0 to 9

এখানে আবার, (ইন্টার) একটি শ্রেণীর ভিতরে ঘোষিত ভ্যানিলা পদ্ধতি (আসলে এখানে আরও কিছু অন্তর্নিহিত ধরণের রূপান্তর রয়েছে তবে আপনি বামনা পান)।

জাভা শরণার্থীদের জন্য স্কালা থেকে অংশ 6:: জাভা ছাড়াই :

"এখন, আপনি যখন" মি 0 "চেষ্টা করেন, স্কালাকে বৈধ না হওয়ার কারণে (ary,!, - এবং +) অকার্যকর অপারেটর হিসাবে এড়িয়ে যায় It এটি" মি "একটি বৈধ অবজেক্ট - এটি একটি ফাংশন, কোনও পদ্ধতি নয় এবং সমস্ত ফাংশন হ'ল অবজেক্ট।

"0" কোনও বৈধ স্কালাল শনাক্তকারী নয়, এটি কোনও ইনফিক্স বা পোস্টফিক্স অপারেটরও হতে পারে না। অতএব, স্কালা অভিযোগ করে যে এটি প্রত্যাশিত ";" - যা দুটি (প্রায়) বৈধ এক্সপ্রেশনকে আলাদা করবে: "এম" এবং "0"। যদি আপনি এটি sertedোকান, তবে এটি অভিযোগ করবে যে মি এর একটি যুক্তি প্রয়োজন, বা এটি ব্যর্থ হয়ে এটিকে একটি আংশিক প্রয়োগিত ফাংশনে পরিণত করতে "_" ""

"আমি বিশ্বাস করি অপারেটর সিনট্যাক্স শৈলী কেবল তখনই কাজ করে যখন আপনি বাম দিকে কোনও স্পষ্ট বস্তু পেয়েছেন। সিনট্যাক্সটি আপনাকে" অপারেন্ড অপারেটর অপারেন্ড "শৈলিক ক্রিয়াকলাপটিকে প্রাকৃতিক উপায়ে প্রকাশ করতে দেবে।"

স্ক্যালায় আমি কোন চরিত্র বাদ দিতে পারি?

তবে আমাকে যা বিভ্রান্ত করে তা হ'ল এই উদ্ধৃতি:

"একটি পদ্ধতি কল গ্রহণের জন্য কোনও অবজেক্ট থাকা দরকার instance উদাহরণস্বরূপ, আপনি" প্রিন্টলন "হ্যালো ওয়ার্ল্ড!" করতে পারবেন না কারণ প্রিন্টলনের কোনও অবজেক্ট গ্রহীতার প্রয়োজন। আপনি "কনসোল প্রিন্টলন" হ্যালো ওয়ার্ল্ড! "করতে পারেন যা প্রয়োজনীয়তাকে সন্তুষ্ট করে।"

কারণ যতদূর আমি দেখতে পাচ্ছি, কলটি পাওয়ার জন্য একটি অবজেক্ট রয়েছে ...


1
ঠিক আছে, তাই কিছু ক্লু এবং ওহ পেতে স্পেস উত্সটি পড়ার চেষ্টা করেছিলেন। এটি ম্যাজিক কোডের সমস্যাগুলির দুর্দান্ত উদাহরণ - অনেকগুলি মিশ্রণ, টাইপ অনুমান এবং অন্তর্নিহিত রূপান্তর এবং অন্তর্নিহিত পরামিতি। বাইরে থেকে বোঝা এত কঠিন! এর মতো বড় লাইব্রেরির জন্য আরও ভাল টুলিং কিছু বিস্ময়কর কাজ করতে পারে ... একদিন ...
অ্যান্টনি স্টাবস

3

থাম্বের এই নিয়মটি অনুসরণ করা আমার পক্ষে আরও সহজ মনে হয়েছে: পদ্ধতি এবং পরামিতিগুলির মধ্যে বিকল্প ব্যবস্থায় অভিব্যক্তিগুলিতে। আপনার উদাহরণে, (service.findAllPresentations.get.first.votes.size) must be equalTo(2)পার্স হিসাবে (service.findAllPresentations.get.first.votes.size).must(be)(equalTo(2))। নোট করুন যে 2 এর কাছাকাছি প্রথম বন্ধনীর ফাঁকা জায়গাগুলির চেয়ে উচ্চতর সংযুক্তি রয়েছে। বিন্দুতে উচ্চতর সাহচর্য রয়েছে, তাই (service.findAllPresentations.get.first.votes.size) must be.equalTo(2)পার্স করা হবে(service.findAllPresentations.get.first.votes.size).must(be.equalTo(2))

service findAllPresentations get first votes size must be equalTo 2পার্স হিসাবে service.findAllPresentations(get).first(votes).size(must).be(equalTo).2


2

আসলে, দ্বিতীয় পাঠে, সম্ভবত এটিই মূল:

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

ব্লগ পোস্টে উল্লিখিত হিসাবে: http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6

সুতরাং সম্ভবত এটি একটি খুব কঠোর "সিনট্যাক্স চিনির" যা কেবল সেখানেই কাজ করে যেখানে আপনি কার্যকরভাবে কোনও পদ্ধতিতে কল করছেন, কোনও বস্তুতে, যা একটি পরামিতি নেয় । যেমন

1 + 2
1.+(2)

এবং আর কিছুনা.

এটি প্রশ্নে আমার উদাহরণগুলি ব্যাখ্যা করবে।

তবে আমি যেমন বলেছি, কেউ যদি ভাষা নির্দিষ্টভাবে এটি নির্দিষ্ট করে থাকে ঠিক সেখানে চিহ্নিত করতে পারে, তবে প্রশংসা হবে।

ঠিক আছে, কিছু সুন্দর সহকর্মী (# স্কালার পলপ_) নির্দেশ করেছেন যে ভাষায় কোথায় এই তথ্যটি রয়েছে:

.1.১২.৩: অপারেটরগুলির অগ্রাধিকার এবং সাহচর্যতা নীচের মত একটি অভিব্যক্তির অংশগুলির গোষ্ঠীকরণ নির্ধারণ করে।

  • যদি কোনও অভিব্যক্তিতে বেশ কয়েকটি ইনফিক্স অপারেশন হয়, তবে উচ্চতর অগ্রাধিকারযুক্ত অপারেটরগুলি নীচের নজিরযুক্ত অপারেটরগুলির চেয়ে আরও ঘনিষ্ঠভাবে আবদ্ধ হয়।
  • যদি ধারাবাহিক ইনফিক্স অপারেশন হয় e0 op1 e1 op2। । অপারেটরদের সাথে op1,। । । , একই নজির ওপেন, তারপরে এই সমস্ত অপারেটরের অবশ্যই একই রকম সাহসিকতা থাকতে হবে। সমস্ত অপারেটর যদি বাম-সহযোগী হয় তবে অনুক্রমটি (।। (E0 op1 e1) op2।।) Opn en হিসাবে ব্যাখ্যা করা হয়। অন্যথায়, সমস্ত অপারেটর যদি রাইটাসোসিয়েটিভ হয় তবে এই অনুক্রমটি e0 op1 (e1 op2 (। .Opn en)।।।) হিসাবে ব্যাখ্যা করা হবে।
  • পোস্টফিক্স অপারেটরগুলির সর্বদা ইনফিক্স অপারেটরগুলির চেয়ে কম অগ্রাধিকার থাকে। উদাহরণস্বরূপ e1 op1 e2 op2 সর্বদা (e1 op1 ই 2) op2 এর সমতুল্য।

বাম-সহযোগী অপারেটরের ডান হাতের ক্রিয়াকলাপটি বন্ধনীতে আবদ্ধ কয়েকটি যুক্তি সমন্বিত হতে পারে, যেমন ই ওপ (ই 1,।, এন)। এই এক্সপ্রেশনটি তখন e.op (e1,।।, En) হিসাবে ব্যাখ্যা করা হয়।

একটি বাম-সহযোগী বাইনারি অপারেশন ই 1 অপ্ট ই 2 এর ব্যাখ্যা e1.op (e2) হিসাবে করা হয়। যদি ওপেন রাইটাসোসিয়েটিভ হয় তবে একই ক্রিয়াকে {ভল x = ই 1 হিসাবে ব্যাখ্যা করা হবে; e2.op (x)}, যেখানে এক্স একটি নতুন নাম।

হুম - আমার কাছে এটি যা দেখছে তার সাথে এটি জাল হয় না বা আমি কেবল এটি বুঝতে পারি না;)


হুঁ, আরও বিভ্রান্তি যুক্ত করার জন্য, এটিও বৈধ: ((((রিয়েলসেসার্স সন্ধান করুন সকলের প্রাপ্তি) প্রথম) ভোট) আকার) অবশ্যই 2 এর সমান হবে, তবে আমি যদি এই প্রথম বন্ধনীর জুটি অপসারণ করি না ...
অ্যান্টনি স্টাবস 13

2

কিছু নেই। ফাংশনটির পার্শ্ব-প্রতিক্রিয়া রয়েছে কি না সে সম্পর্কে আপনি সম্ভবত পরামর্শ পাবেন। এটি বোগাস। সংশোধন হ'ল স্কালার দ্বারা অনুমোদিত যুক্তিসঙ্গত পরিমাণে পার্শ্ব-প্রতিক্রিয়া ব্যবহার না করা। এটি যে পরিমাণে এটি করতে পারে না, তারপরে সমস্ত বেট বন্ধ রয়েছে। সব বেট। বন্ধনী ব্যবহার করা সেট "সমস্ত" সেটগুলির একটি উপাদান এবং অতিরিক্ত অতিরিক্ত। সমস্ত বেট বন্ধ হয়ে গেলে এটি কোনও মান সরবরাহ করে না।

এই পরামর্শটি মূলত একটি প্রভাব সিস্টেমের একটি প্রচেষ্টা যা ব্যর্থ হয় (এতে বিভ্রান্ত হওয়ার দরকার নেই: অন্যান্য এফেক্ট সিস্টেমগুলির তুলনায় কম দরকারী)।

পার্শ্ব প্রতিক্রিয়া না করার চেষ্টা করুন। এর পরে, সমস্ত বেট বন্ধ আছে তা গ্রহণ করুন। কোনও প্রভাব সিস্টেমের জন্য ডি ফ্যাক্টো সিন্ট্যাকটিক স্বরলিপিটির আড়ালে লুকানো কেবল ক্ষতির কারণ হতে পারে।


ঠিক আছে, তবে আপনি যখন হাইব্রিড ওও / কার্যকরী ভাষা নিয়ে কাজ করছেন ঠিক তখনই সমস্যাটি? কোনও ব্যবহারিক উদাহরণে আপনি সাইড এফেক্ট ফাংশন রাখতে চাইছেন ... আপনি কি আমাদের "এফেক্ট সিস্টেম" সম্পর্কে কিছু তথ্য নির্দেশ করতে পারেন? আমি মনে করি উদ্ধৃতিটির আরও আরও উল্লেখযোগ্য বিষয় হ'ল "কোন প্যারামিটারবিহীন একটি ফাংশন প্রথম বন্ধনী ছাড়াই ঘোষণা করা যায় না, এক্ষেত্রে এটি কোনও বন্ধনী ছাড়াই কল করা উচিত এটি ইউনিফর্ম অ্যাক্সেস নীতিমালার জন্য সমর্থন সরবরাহ করে, যেমন কলার জানেন না যে প্রতীক একটি পরিবর্তনশীল বা কোনও পরামিতিবিহীন একটি ক্রিয়াকলাপ।
অ্যান্টনি স্টাবস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.