我是 Scala 的新手,并按照其中一个示例让 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
}
为什么我必须在 EditDone(`fahrenheit`) 和 EditDone(`celsius`) 中使用反引号 (`) 来识别我的文本字段组件,例如
fahrenheit
和 celsius
?为什么我不能只使用 EditDone(fahrenheit)
反而?谢谢
最佳答案
这与模式匹配有关。如果在模式匹配中使用小写名称:
reactions += {
case EditDone(fahrenheit) => // ...
}
那么被匹配的对象(本例中的事件)将与任何
EditDone
匹配。任何小部件上的事件。它将对小部件的引用绑定(bind)到名称 fahrenheit
. fahrenheit
成为该案例范围内的新值。但是,如果您使用反引号:
val fahrenheit = new TextField
...
reactions += {
case EditDone(`fahrenheit`) => // ...
}
那么模式匹配只有在
EditDone
时才会成功event 引用值 fahrenheit
引用的现有对象, 之前定义的。请注意,如果值的名称
fahrenheit
为大写,如 Fahrenheit
, 那么你就不必使用反引号 - 就好像你已经放了它们一样。如果您在范围内有要匹配的常量或对象,这很有用 - 这些通常具有大写名称。
关于events - Scala Swing 事件中使用的反引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6564220/