手机上的 Scala:使用 Android、Scala 和 Eclipse 创建移动应用程序
2009-12-25 00:00:00 来源:WEB开发网如果用 Java 语言编写,那么必须传入 Android 接口 OnClickListener 的一个实现。这个接口只定义一个方法:onClick。实际上,您关心的只是那个方法,但是在 Java 语言中无法直接传入方法。而在 Scala 中则不同,在 Scala 中可以传入方法字面量(literal)或闭包。在这里,我们用语法 () => { ... } 表示闭包,其中方法的主体就是花括号中的内容。开始/结束括号表示一个不带参数的函数。但是,我将这个闭包传递到 Button 的一个实例上的 setOnClickListener 方法,Button 是 Android SDK 中定义的一个 Java 类。如何将 Scala 闭包传递到 Java API?我们来看看。
Android 上的函数式编程
为了理解如何让 Android API 使用函数字面量,看看 Converter 类定义的第一行。这是一条重要的语句。这是 Scala 的另一个很好的特性。您可以在代码的任何地方导入包、类等,它们的作用域限于导入它们的文件。在这里,我们导入 ConverterHelper 中的所有东西。清单 5 显示 ConverterHelper 代码。
清单 5. ConverterHelperobject ConverterHelper{
import android.view.View.OnClickListener
implicit def funcToClicker(f:View => Unit):OnClickListener =
new OnClickListener(){ def onClick(v:View)=f.apply(v)}
implicit def funcToClicker0(f:() => Unit):OnClickListener =
new OnClickListener() { def onClick(v:View)=f.apply}
}
这是一个 Scala 单例(singleton),因为它使用对象声明,而不是类声明。单例模式被直接内置在 Scala 中,可以替代 Java 语言中的静态方法或变量。在这里,这个单例存放一对函数:funcToClicker 和 funcToClicker0。这两个函数以一个函数作为输入参数,并返回 OnClickListener 的一个实例,OnClickListener 是 Android SDK 中定义的一个接口。例如,funcToClicker 被定义为以一个函数 f 为参数。这个函数 f 的类型为带一个 View 类型(Android 中的另一个类)的输入参数的函数,并返回 Unit,它是 void 在 Scala 中的对等物。然后,它返回 OnClickListener 的一个实现,在这个实现中,该接口的 onClick 方法被实现为将输入函数 f 应用到 View 参数。另一个函数 funcToClick0 也做同样的事情,只是以一个不带输入参数的函数为参数。
更多精彩
赞助商链接