Latest web development tutorials

Scala จับคู่รูปแบบ

สกาล่าให้เป็นรูปแบบที่มีประสิทธิภาพกลไกการจับคู่ยังเป็นที่ใช้กันอย่างแพร่หลาย

รูปแบบการจับคู่มีชุดของทางเลือกของแต่ละคนซึ่งจะเริ่มขึ้นกับกรณีคำหลักแต่ละคนมีตัวเลือกสำรองข้อมูลและรูปแบบเพื่อส่วนใหญ่ของการแสดงออก ลูกศรสัญลักษณ์=> แยกรูปแบบและการแสดงออก

ต่อไปนี้เป็นรูปแบบที่เรียบง่ายตรงกับตัวอย่างค่าจำนวนเต็ม:

object Test {
   def main(args: Array[String]) {
      println(matchTest(3))

   }
   def matchTest(x: Int): String = x match {
      case 1 => "one"
      case 2 => "two"
      case _ => "many"
   }
}

การดำเนินงานของโค้ดข้างต้นผลลัพธ์คือ:

$ scalac Test.scala 
$ scala Test
many

ตรงกับ Java ที่สอดคล้องกันในสวิทช์ แต่เขียนขึ้นหลังจากที่การแสดงออกของตัวเลือกคือตัวเลือกการจับคู่ทางเลือก {}

ตามคำสั่งของการแสดงออกเพื่อให้ตรงกับรหัสที่เขียนจะลองแต่ละโหมดจะเสร็จสมบูรณ์ในการคำนวณถ้าพวกเขาพบว่ามีกรณีการจับคู่จับคู่ส่วนที่เหลือของคดีจะไม่ดำเนินการต่อ

ต่อไปเรามองไปที่ชนิดข้อมูลที่แตกต่างกันของการจับคู่รูปแบบ:

object Test {
   def main(args: Array[String]) {
      println(matchTest("two"))
      println(matchTest("test"))
      println(matchTest(1))
      println(matchTest(6))

   }
   def matchTest(x: Any): Any = x match {
      case 1 => "one"
      case "two" => 2
      case y: Int => "scala.Int"
      case _ => "many"
   }
}

การดำเนินงานของโค้ดข้างต้นผลลัพธ์คือ:

$ scalac Test.scala 
$ scala Test
2
many
one
scala.Int

ตัวอย่างของกรณีแรกที่สอดคล้องกับค่าจำนวนเต็ม 1, กรณีที่สองที่สอดคล้องกับค่าสตริงของทั้งสองกรณีที่สองที่สอดคล้องกับค่าสตริงของทั้งสองกรณีที่สามสอดคล้องกับประเภทของรูปแบบที่ใช้ในการตรวจสอบว่าค่าที่ส่งทั้งหมด ชนิดใช้เมื่อเทียบ isInstanceOf เพื่อตรวจสอบชนิดจับคู่รูปแบบจะดีกว่า กรณีที่สี่เริ่มต้นบ่งชี้ทางเลือกเต็มรูปแบบการแข่งขันการแข่งขันที่ไม่ได้พบในการแข่งขันอื่น ๆ , สวิทช์ที่คล้ายกันในการเริ่มต้น


ใช้คลาสของตัวอย่าง

ใช้กรณีคำหลักคือการกำหนดชั้นเป็นชั้นตัวอย่าง (กรณีชั้นเรียน) รุ่นตัวอย่างเป็นชั้นพิเศษเหมาะสำหรับการจับคู่รูปแบบ

ต่อไปนี้คือตัวอย่างง่ายๆของการเรียนตัวอย่าง:

object Test {
   def main(args: Array[String]) {
   	val alice = new Person("Alice", 25)
	val bob = new Person("Bob", 32)
   	val charlie = new Person("Charlie", 32)
   
    for (person <- List(alice, bob, charlie)) {
    	person match {
            case Person("Alice", 25) => println("Hi Alice!")
            case Person("Bob", 32) => println("Hi Bob!")
            case Person(name, age) =>
               println("Age: " + age + " year, name: " + name + "?")
         }
      }
   }
   // 样例类
   case class Person(name: String, age: Int)
}

การดำเนินงานของโค้ดข้างต้นผลลัพธ์คือ:

$ scalac Test.scala 
$ scala Test
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

เมื่อคุณประกาศตัวอย่างชั้นเรียนขั้นตอนต่อไปเกิดขึ้นโดยอัตโนมัติ:

  • คอนสตรัคแต่ละพารามิเตอร์จะกลายเป็น Val เว้นแต่ประกาศอย่างชัดเจนว่า var แต่ที่ไม่แนะนำ;
  • ให้ใช้วิธีการวัตถุที่เกี่ยวข้องเพื่อให้คุณสามารถสร้างวัตถุไม่สามารถใช้คำหลักใหม่;
  • วิธี unapply ที่จัดไว้ให้ช่วยจับคู่รูปแบบสามารถทำงาน;
  • สร้าง toString เท่ากับ hashCode และคัดลอกวิธีเว้นแต่จอจะแสดงคำจำกัดความของวิธีการเหล่านั้น