看一下JavaScript中的这个e4x示例:
var sales = <sales vendor="John">
<item type="peas" price="4" quantity="6"/>
<item type="carrot" price="3" quantity="10"/>
<item type="chips" price="5" quantity="3"/>
</sales>;
alert( sales.item.(@type == "carrot").@quantity );
alert( sales.@vendor );
for each( var price in sales..@price ) {
alert( price );
}
特别是,看看线:
alert( sales.item.(@type == "carrot").@quantity );
在典型的静态语言中,您不必编写 sales.item,因为直到运行时您才能知道该 item 是 sales 的属性。这不仅限于 e4x。在编写 SOAP 客户端或任何其他直到运行时才知道的底层类型时,您可以在连接时以类似的风格进行编程。在静态语言中,您通常需要运行一个以非常冗长的方式生成存根类或程序的工具。然后,如果 Web 服务发生变化,您需要重新生成存根。看一下java DOM代码:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Foo {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement( "root" );
Element author1 = root.addElement( "author" )
.addAttribute( "name", "James" )
.addAttribute( "location", "UK" )
.addText( "James Strachan" );
Element author2 = root.addElement( "author" )
.addAttribute( "name", "Bob" )
.addAttribute( "location", "US" )
.addText( "Bob McWhirter" );
return document;
}
}
绝对比您的动态代码详细得多。而且,当然,它不是静态类型的。在运行之前,无法检查您是否将“作者”拼写为“作者”。所有这些冗长的内容本质上都是为了让您以静态风格捕捉本质上是动态的东西。
I think this is one of the strong points of dynamic languages.