2011-08-16 6 views
91

Đi chức năng sau:Tại sao khớp mẫu trong Scala không hoạt động với các biến?

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

Mô hình này phù hợp độc đáo:

scala> fMatch("a") 
It was a 

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

Những gì tôi muốn để có thể làm là như sau:

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

Điều này cho phép ra khỏi lỗi sau:

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

Tôi đoán điều này là bởi vì nó cho rằng đích thực sự là tên mà bạn muốn gán cho bất kỳ đầu vào nào. Hai câu hỏi:

  1. Tại sao lại có hành vi này? Không thể chỉ tìm kiếm các biến hiện có trong phạm vi có loại thích hợp và sử dụng các biến đó trước và nếu không tìm thấy, thì coi mục tiêu là tên để patternmatch kết thúc?

  2. Có giải pháp cho việc này không? Bất kỳ cách nào để mô hình phù hợp với các biến? Cuối cùng người ta có thể sử dụng một tuyên bố nếu lớn, nhưng trường hợp phù hợp là thanh lịch hơn.

+0

Related: http://stackoverflow.com/questions/7083502/why-cant-a-variable-be-a-stable-identifier –

+0

Tôi tin rằng câu hỏi này, mã và câu trả lời là lỗi thời như của Scala 2.12.x. Nó sẽ là tốt đẹp nếu phiên bản được áp dụng đã được đề cập như là một phần của câu hỏi. – conny

Trả lời

181

Điều bạn đang tìm kiếm là số nhận dạng ổn định. Trong Scala, chúng phải bắt đầu bằng một chữ hoa, hoặc được bao quanh bởi các dấu backticks.

Cả hai sẽ là giải pháp cho vấn đề của bạn:

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") 
    } 
} 

Để tránh vô tình đề cập đến các biến mà đã tồn tại trong phạm vi kèm theo, tôi nghĩ rằng nó có ý nghĩa rằng các hành vi mặc định là cho các mẫu chữ thường được biến và định danh không ổn định. Chỉ khi bạn nhìn thấy một cái gì đó bắt đầu với trường hợp trên, hoặc trong ve trở lại, bạn cần phải nhận thức được rằng nó đến từ phạm vi xung quanh.

+2

Tôi đặt cược điều này đến từ Erlang, nơi các biến bắt đầu bằng một chữ cái viết hoa và các ký hiệu có chữ thường. –

+9

Lưu ý rằng 'target' là một giá trị (' val'), và không phải là một biến ('var'). Nó không hoạt động với các biến. –

+0

Chữ hoa? Sắc thái của FORTRAN. Yếu, Martin, yếu đuối. – Malvolio