我是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
事件进行匹配。它将对小部件的引用绑定到名称fahrenheit
。在这种情况下,fahrenheit
变为新值。但是,如果使用反引号:
val fahrenheit = new TextField
...
reactions += {
case EditDone(`fahrenheit`) => // ...
}
那么只有
EditDone
事件引用先前定义的值fahrenheit
引用的现有对象时,模式匹配才会成功。请注意,如果值
fahrenheit
的名称是大写字母(例如Fahrenheit
),则无需使用反引号-就像您已经将它们放在了一样。如果在范围内有要匹配的常量或对象,这将很有用-这些常量或对象通常具有大写名称。