手机上的 Scala:使用 Android、Scala 和 Eclipse 创建移动应用程序
2009-12-25 00:00:00 来源:WEB开发网这两个函数(funcToClicker 和 funcToClicker0)都被定义为隐式函数(implicit)。这是 Scala 的一个方便的特性。它可以让编译器隐式地将一种类型转换成另一种类型。在这里,当编译器解析 Converter 类的 onCreate 方法时,它遇到一个 setOnClickListener 调用。这个方法需要一个 OnClickListener 实例。但是,编译器却发现一个函数。在报错并出现编译失败之前,编译器将检查是否存在隐式函数,允许将函数转换为 OnClickListener。由于确实还有这样的函数,所以它执行转换,编译成功。现在,我们理解了如何使用 Android 中的闭包,接下来更仔细地看看应用程序逻辑 — 特别是,如何执行单位转换计算。
单位转换和计算
我们回到清单 4。传入 onClickListener 的函数收到用户输入的度量单位和值。然后,它创建一个 Measurement 实例,并将该实例传递到一个 UnitsConverter 对象。清单 6 显示相应的代码。
清单 6. Measurement 和 UnitsConvertercase class Measurement(uom:String, amount:Double)
object UnitsConverter{
// constants
val lbToKg = 0.45359237D
val ozToG = 28.3495231
val fOzToMl = 29.5735296
val galToL = 3.78541178
val milesToKm = 1.609344
val inchToCm = 2.54
def convert (measure:Measurement)= measure.uom match {
case "Fahrenheit" => (5.0/9.0)*(measure.amount - 32.0) + " C"
case "Pounds" => lbToKg*measure.amount + " kg"
case "Ounces" => ozToG*measure.amount + " g"
case "Fluid Ounces" => fOzToMl*measure.amount + " mL"
case "Gallons" => galToL*measure.amount + " L"
case "Miles" => milesToKm*measure.amount + " km"
case "Inches" => inchToCm*measure.amount + " cm"
case "Celsius" => (9.0/5.0*measure.amount + 32.0) + " F"
case "Kilograms" => measure.amount/lbToKg + " lbs"
case "Grams" => measure.amount/ozToG + " oz"
case "Millileters" => measure.amount/fOzToMl + " fl. oz."
case "Liters" => measure.amount/galToL + " gallons"
case "Kilometers" => measure.amount/milesToKm + " miles"
case "Centimeters" => measure.amount/inchToCm + " inches"
case _ => ""
}
}
更多精彩
赞助商链接