2011-07-03 2 views
7

Tôi mới sử dụng Scala và làm theo một trong các ví dụ để có được Swing làm việc trong Scala và tôi hava một câu hỏi. Dựa trên,Backquote Được sử dụng trong Sự kiện Swing Scala

listenTo(celsius, fahrenheit) 
    reactions += { 
     case EditDone(`fahrenheit`) => 
     val f = Integer.parseInt(fahrenheit.text) 
     celsius.text = ((f - 32) * 5/9).toString 

     case EditDone(`celsius`) => 
     val c = Integer.parseInt(celsius.text) 
     fahrenheit.text = ((c * 9)/5 + 32).toString 
    } 

tại sao tôi phải sử dụng backquote (`) trong EditDone (` fahrenheit`) và EditDone (`celsius`) để xác định thành phần TextField tôi ví dụ fahrenheitcelsius? Tại sao tôi không thể sử dụng EditDone(fahrenheit) để thay thế?

Cảm ơn

Trả lời

15

Điều này phải làm với khớp mẫu. Nếu bạn sử dụng một tên chữ thường trong một mô hình phù hợp:

reactions += { 
    case EditDone(fahrenheit) => // ... 
} 

sau đó các đối tượng được phù hợp (trường hợp trong trường hợp này) sẽ được kết hợp với bất kỳ EditDone sự kiện trên bất kỳ widget. Nó sẽ liên kết tham chiếu đến tiện ích con với tên fahrenheit. fahrenheit trở thành một giá trị mới trong phạm vi của trường hợp đó.

Tuy nhiên, nếu bạn sử dụng backticks:

val fahrenheit = new TextField 
... 
reactions += { 
    case EditDone(`fahrenheit`) => // ... 
} 

thì mô hình phù hợp sẽ chỉ thành công nếu trường hợp EditDone đề cập đến đối tượng hiện có tham chiếu bởi giá trị fahrenheit, được xác định trước đó.

Lưu ý rằng nếu tên của giá trị fahrenheit là chữ hoa, như Fahrenheit, thì bạn sẽ không phải sử dụng backticks - nó sẽ giống như bạn đã đặt chúng. Điều này rất hữu ích nếu bạn có các hằng số hoặc các đối tượng trong phạm vi mà bạn muốn đối sánh - chúng thường có các tên viết hoa.

8
case EditDone(`fahrenheit`) 

trích ra một giá trị từ EditDone và so sánh nó với các biến địa phương hiện fahrenheit, trong khi

case EditDone(fahrenheit) 

trích ra một giá trị từ EditDone, tạo ra một biến địa phương mới fahrenheit (do đó shadowing cái hiện có) và gán giá trị được trích xuất cho biến mới.