স্কালার প্যাটার্ন ম্যাচিং সিস্টেমে তুলনা অপারেটরগুলি ব্যবহার করে


148

স্কালায় প্যাটার্ন ম্যাচিং সিস্টেমটি ব্যবহার করে তুলনার সাথে মিল পাওয়া সম্ভব? উদাহরণ স্বরূপ:

a match {
    case 10 => println("ten")
    case _ > 10 => println("greater than ten")
    case _ => println("less than ten")
}

দ্বিতীয় কেসের বিবৃতিটি অবৈধ, তবে আমি "যখন একটি এর চেয়ে বড় হয়" তা নির্দিষ্ট করতে সক্ষম হতে চাই।


1
এটি কোনও ফাংশন সত্যের কাছে মূল্যায়ন করে কিনা তা পরীক্ষা করেও ব্যবহার করা যেতে পারে, উদাহরণস্বরূপcase x if x.size > 2 => ...
tstenner

2
গুরুত্বপূর্ণ বিষয়টি বুঝতে হবে যে => অপারেটরের বাম দিকে "নিদর্শনগুলি" আসলে "নিদর্শন"। 10 টির প্রথম ক্ষেত্রে আপনার এক্সপ্রেশনটি পূর্ণসংখ্যা হয় না। সুতরাং, আপনি অপারেশনগুলি সম্পাদন করতে পারবেন না (যেমন> যাচাই বা বলতে পারেন ফাংশন অ্যাপ্লিকেশন isdd (_)) বাম দিকে।
উস্তামান সংগীত 1'13

উত্তর:


292

আপনি কোনও প্রহরী যুক্ত করতে পারেন, যেমন ifপ্যাটার্নের পরে একটি এবং বুলিয়ান এক্সপ্রেশন:

a match {
    case 10 => println("ten")
    case x if x > 10 => println("greater than ten")
    case _ => println("less than ten")
}

সম্পাদনা: নোট যে এই বেশি কৃত্রিম একটি নির্বাণ ভিন্ন if পর=> , কারণ একটি প্যাটার্ন করা হবে না যদি পাহারা সত্য নয় মেলে।


3
বেন, ভাল উত্তর, এটি সত্যিই প্যাটার্ন গার্ডের গুরুত্ব চিত্রিত করে।
জেফভি

32

প্রশ্নের স্পিরিটের একটি উত্তর না হিসাবে, কীভাবে কোনও ম্যাচের ধারাটিতে ভবিষ্যদ্বাণীগুলি অন্তর্ভুক্ত করতে হবে জিজ্ঞাসা করেছিল, এক্ষেত্রে ভবিষ্যদ্বাণীটি এর আগে প্রমাণ করা যেতে পারে match:

def assess(n: Int) {
  println(
    n compare 10 match {
      case 0 => "ten"
      case 1 => "greater than ten"
      case -1 => "less than ten"
    })
}

এখন, কেবল প্রতিশ্রুতিগুলির জন্য ডকুমেন্টেশনটিscala.math.Ordering.compare(T, T) অ-সমমানের ফলাফল শূন্যের চেয়ে বড় বা কম হবে । জাভা Comparable#compareTo(T)স্কালার সাথে একইভাবে নির্দিষ্ট করা হয়। স্কালার বর্তমান বাস্তবায়ন যেমন যথাক্রমে ধনাত্মক এবং নেতিবাচক মানগুলির জন্য 1 এবং -1 ব্যবহার করা প্রচলিত হতে পারে তবে বাস্তবায়নের কোনও ঝুঁকি ছাড়াই কেউ এ ধরণের ধারণা অনুমান করতে পারে না।


5
আপনি যদি এটিকে আসল সমাধান হিসাবে পরামর্শ দিচ্ছেন তবে আমি নিশ্চিত নই, তবে আমি অনাবন্ধিত কনভেনশন বা অনুমানের উপর নির্ভর করে এমন কোনও কিছুর বিরুদ্ধে দৃ strongly়তার সাথে সুপারিশ করব।
বেন জেমস

1
যথাযথভাবে। এ কারণেই আমি লিখেছি "কেউ কিছু ঝুঁকি ছাড়াই এমন ধারণা তৈরি করতে পারে না", এবং আমার উত্তরটিকে "উত্তর-না" হিসাবে যোগ্য করে তুলেছে। কেন তাদের কোডোমেন হিসাবে 0, 1 এবং -1 নির্দিষ্ট করে না compare()এবং compareTo()তা বিবেচনা করা আকর্ষণীয় ।
Seh

4
ম্যাথ সিগনাম (এন 10 টি তুলনা করুন) -1, 0 বা 1 গ্যারান্টি দেয়
সমৃদ্ধ

1
এই সকালে আমি নিশ্চিত করেছি যে আমার মূল উত্তরটি লেখার প্রায় ছয় বছর পরেও, যদিও প্রশ্নে বাস্তবায়নটি এক ধরণের থেকে অন্য ধরণের দিকে চলে গেছে, স্কালাল এখনও -1, 0, বা 1-এ ফিরে যাওয়ার সেই উল্লেখযোগ্য আচরণ বজায় রেখেছে
সেখ

2
একটি বৈধ উত্তর, কিন্তু ব্যক্তিগতভাবে আমি এটি পছন্দ করি না। 0,1 এবং -1 এর অর্থ কী বলে মনে করা যায় তা ভুলে যাওয়া খুব সহজ।
ড্যানগার্ডন

21

এমন একটি সমাধান যা আমার মতে গার্ডদের যুক্ত করার চেয়ে অনেক বেশি পঠনযোগ্য:

(n compare 10).signum match {
    case -1 => "less than ten"
    case  0 => "ten"
    case  1 => "greater than ten"
}

মন্তব্য:

  • Ordered.compareযদি এটি এর চেয়ে কম হয় তবে negativeণাত্মক পূর্ণসংখ্যা প্রদান করে, বড় হলে ধনাত্মক এবং 0সমান হলে।
  • Int.signumথেকে আউটপুট সংকোচন compareকরার -1একটি ঋণাত্মক সংখ্যা (10 কম) জন্য, 1ইতিবাচক জন্য (10 তার চেয়ে অনেক বেশী), অথবা 0শূন্য জন্য (10 সমান)।

1

উপরের সমস্ত এবং নিচু উত্তরগুলি মূল প্রশ্নের সঠিক উত্তর দেয়, তবে কিছু অতিরিক্ত তথ্য https://docs.scala-lang.org/tour/pattern-matching.html ডকুমেন্টেশনে পাওয়া যায় , তারা আমার ক্ষেত্রে ফিট করে না তবে এই স্ট্যাকওভারফ্লো উত্তরটি গুগলের প্রথম পরামর্শ হ'ল আমি আমার উত্তরটি পোস্ট করতে চাই যা উপরের প্রশ্নের একটি কোণার বিষয়।
আমার প্রশ্নটি হ'ল:

  • কোনও ফাংশনের আর্গুমেন্টের সাথে ম্যাচ এক্সপ্রেশনে গার্ড কীভাবে ব্যবহার করবেন?

যা প্যারাফ্রেস করা যেতে পারে:

  • কোনও ফাংশনের আর্গুমেন্টের সাথে ম্যাচ এক্সপ্রেশনে যদি একটি বিবৃতি ব্যবহার করবেন?

উত্তরটি নীচের কোড উদাহরণ:

    def drop[A](l: List[A], n: Int): List[A] = l match {
      case Nil => sys.error("drop on empty list")
      case xs if n <= 0 => xs
      case _ :: xs => drop(xs, n-1)
    }

স্কালা ফ্রিডেলের লিঙ্ক: https://scalafiddle.io/sf/G37THif/2 আপনি দেখতে পাবেন যে case xs if n <= 0 => xsবিবৃতি প্রহরী (যদি) বিবৃতি দিয়ে এন (একটি ফাংশনের যুক্তি) ব্যবহার করতে সক্ষম হয়।

আমি আশা করি এটি আমার মতো কাউকে সহায়তা করবে।

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