Silverlight 的重要功能之一是支持动态语言(如 IronRuby 和 IronPython)。通过这一集成功能,可以使用 Silverlight 平台来开发富 Internet 应用程序 (RIA) - XAML 用于表示层,动态语言用于代码隐藏。本文演示 Silverlight 与动态语言的集成功能以及 Microsoft Bing Map 控件。首先,我将简要介绍动态语言,然后深入讨论 Silverlight 对这些语言的支持。最后,作为总结,我将演示如何使用 Microsoft Bing Map Silverlight 控件和 IronRuby 生成交互式 3D 动画位置查找 Silverlight 应用程序。
动态语言基础知识
Read-Eval-Print Loop (REPL) 环境通过使用动态编程语言(在运行时动态类型化和编译的语言),为开发人员提供轻型“即写即用”编程功能。您不需要声明特定数据类型的变量。所有代码均由运行时通过表达式上下文进行处理。
我们更熟悉的语言(如 C# 和 Visual Basic)是静态类型语言,在灵活性上稍逊一筹。与这些需要编译和分发输出的静态语言相比,使用动态语言进行开发和部署更为简单。不过,在使用动态类型语言时,仍然需要验证和测试类型安全性。
使用动态语言时,可以创建一个函数,然后将它赋给变量或作为参数传递给另一个函数。这样,可以更方便地使用闭包和将函数作为参数进行传递。通常,闭包有两个明确的特点:可以将代码块(函数)赋给变量;对于在创建时可访问的变量,代码块能够保留访问权限。
下面是用 C# 编写的传统 ShortWords 方法,该方法返回一个单词列表子集,其中包含符合单词长度不超过 3 这一条件的单词:
public static List<string> ShortWords(List<string> wordList) {
List<string> shortWordList = new List<string>();
int maximumWordLength = 3;
foreach(string word in wordList) {
if(word.Length <= maximumWordLength) {
shortWordList.Add(word);
}
}
return(shortWordList);
}
使用 LINQ 可以更加高效地实现类似功能,如以下代码段所示:
public static List<string> ShortWords(List<string> wordList) {
var maximumWordLength = 3;
return wordList.Where(w => w.Length <=
maximumWordLength).ToList<string>();
end
用 IronRuby 等动态语言实现该方法(Microsoft .NET Framework 的 Ruby 编程语言实现)类似于在 C# 中使用 LINQ 方法,但比传统方法简短得多:
def ShortWords(wordList)
maximumWordLength = 3
return wordList.select {|w| w.Length <= maximumWordLength}
end
只要对比一下上述算法的这两种实现,就可对 IronRuby(以及其他动态语言)有不少了解。IronRuby 代码非常简洁,不包含任何数据类型关键字(如 string 或 int)。
此 IronRuby 代码块中,最令人感兴趣的是花括号之间的闭包。这里的闭包实际上是一个函数,它被传递给 Select 方法。Select 方法使用闭包提取集合的子集。构成该闭包的代码实际在 Select 方法内执行(此处,闭包提取集合 wordList 中符合条件的字符串),但保留对其原始作用域中的变量(在本示例中,即 maximumWordLength 变量)的访问权限。
闭包的功能非常强大,此简单示例仅作演示之用。闭包类似于在 C# 中使用 LINQ 或向 Exists 或 Find 方法传递委托,此外,闭包还有一个优点,可保留对其原始作用域的访问权限。有关闭包的详细信息,请参阅我与 Jeff Scanlon 合著的“Accelerated Silverlight 3”(Apress,2009 年 7 月)一书。