স্কালায় প্যাটার্নের মিলগুলি ভেরিয়েবলগুলির সাথে কেন কাজ করে না?


113

নিম্নলিখিত ফাংশন নিন:

def fMatch(s: String) = {
    s match {
        case "a" => println("It was a")
        case _ => println("It was something else")
    }
}

এই প্যাটার্নটি সুন্দরভাবে মেলে:

scala> fMatch("a")
It was a

scala> fMatch("b")
It was something else

আমি যা করতে সক্ষম হতে চাই তা হল:

def mMatch(s: String) = {
    val target: String = "a"
    s match {
        case target => println("It was" + target)
        case _ => println("It was something else")
        }
}

এটি নিম্নলিখিত ত্রুটিটি দেয়:

fMatch: (s: String)Unit
<console>:12: error: unreachable code
               case _ => println("It was something else")

আমার ধারণা এটি কারণ এটি মনে করে যে লক্ষ্যটি আসলে এমন একটি নাম যা আপনি ইনপুট যা হ'ল তা নির্ধারণ করতে চান। দুটি প্রশ্ন:

  1. কেন এই আচরণ? কেস কেবল উপযুক্ত স্কোরের ক্ষেত্রে বিদ্যমান ভেরিয়েবলগুলি সন্ধান করতে পারে না যা উপযুক্ত টাইপ করে এবং সেগুলি প্রথমে ব্যবহার করে এবং যদি কোনওটি পাওয়া যায় না, তবে লক্ষ্যটিকে প্যাটার্নম্যাচ করার জন্য একটি নাম হিসাবে বিবেচনা করবে?

  2. এটির জন্য কি কোনও কার্যকারিতা রয়েছে? ভেরিয়েবলের সাথে প্যাটার্ন মিলানোর কোনও উপায়? শেষ পর্যন্ত কেউ যদি স্টেটমেন্টটি বড় ব্যবহার করতে পারে তবে ম্যাচের ক্ষেত্রে আরও মার্জিত।



1
আমি বিশ্বাস করি এই প্রশ্ন, কোড এবং উত্তরগুলি Scala 2.12.x হিসাবে পুরানো believe এটি ভাল লাগবে যে সংস্করণটিতে প্রয়োগ করা হয় প্রশ্নের অংশ হিসাবে উল্লেখ করা হয়েছে।
কনিকে

উত্তর:


217

আপনি যা খুঁজছেন তা হ'ল স্থিতিশীল শনাক্তকারী । স্কালায় এগুলি হয় বড় হাতের অক্ষর দিয়ে শুরু করতে হবে, বা ব্যাকটিক্স দ্বারা ঘিরে থাকতে হবে।

এই দুটিই আপনার সমস্যার সমাধান হতে পারে:

def mMatch(s: String) = {
    val target: String = "a"
    s match {
        case `target` => println("It was" + target)
        case _ => println("It was something else")
    }
}

def mMatch2(s: String) = {
    val Target: String = "a"
    s match {
        case Target => println("It was" + Target)
        case _ => println("It was something else")
    }
}

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


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

11
লক্ষ্য করুন যে targetএটি একটি মান ( val) এবং কোনও ভেরিয়েবল ( var) নয়। এটি ভেরিয়েবলের সাথে কাজ করে না।
লুইজি প্লিঞ্জ

আপারকেস? ফরটারনের শেডস। দুর্বল, মার্টিন, দুর্বল।
মালভোলিও

13
@ এমিল আসলে, স্কালায় মূলধন চিহ্নিতকারীরা ধ্রুবকগুলি বোঝায় ote সুতরাং বড় হাতের শনাক্তকরণের সাথে একটি প্যাটার্ন মিলে যাওয়া ধ্রুবকের সাথে তুলনা করার অর্থ নেওয়া হয়। এটি মারাত্মকভাবে মতো জিনিসগুলির সাথে সহায়তা করে Nil, যা আমি বাজি ধরেছিলাম আসল কারণ।
ড্যানিয়েল সি সোব্রাল

দেখে মনে হচ্ছে যে এর thisবিপরীতে ম্যাচের জন্য কোনও স্থির পরিচয়কারী হিসাবে ব্যবহার করতে পারে না , কেবলমাত্র উপায়টি সাম্য রক্ষকের মতো ব্যবহার করছে বলে মনে হয় case x if x == this =>। সম্ভবত একটি সিনট্যাক্টিকাল সীমাবদ্ধতা, অন্যথায় এটি শব্দার্থগতভাবে কমপক্ষে objects এর মধ্যে কাজ করা উচিত ।
নাদের ঘনবাড়ী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.