thl*_*lim 7 events swing scala
我是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
}
Run Code Online (Sandbox Code Playgroud)
为什么我必须在EditDone(`fahrenheit`)和EditDone(`celsius`)中使用反引号(`)来识别我的文本域组件,例如fahrenheit和celsius?为什么我不能用EditDone(fahrenheit)呢?
谢谢
axe*_*l22 15
这与模式匹配有关.如果在模式匹配中使用小写名称:
reactions += {
case EditDone(fahrenheit) => // ...
}
Run Code Online (Sandbox Code Playgroud)
然后匹配的对象(在这种情况下为事件)将与EditDone任何小部件上的任何事件匹配.它会将对窗口小部件的引用绑定到名称fahrenheit.它fahrenheit成为该案例范围内的新值.
但是,如果你使用反引号:
val fahrenheit = new TextField
...
reactions += {
case EditDone(`fahrenheit`) => // ...
}
Run Code Online (Sandbox Code Playgroud)
然后,只有当EditDone事件引用fahrenheit之前定义的值引用的现有对象时,模式匹配才会成功.
请注意,如果值的名称fahrenheit是大写的,Fahrenheit那么你就不必使用反引号 - 就好像你已经放了它们一样.如果要在范围中包含要匹配的常量或对象,这将非常有用 - 这些常量或对象通常具有大写名称.
case EditDone(`fahrenheit`)
Run Code Online (Sandbox Code Playgroud)
从EditDone提取的值,并将其与现有的本地变量fahrenheit,而
case EditDone(fahrenheit)
Run Code Online (Sandbox Code Playgroud)
从EditDone中提取值,创建一个新的局部变量fahrenheit(从而遮蔽现有变量)并将提取的值分配给新变量.
| 归档时间: |
|
| 查看次数: |
582 次 |
| 最近记录: |