go语言和groovy Go语言和Rust( 二 )


现代编程语言那些让人激动的特性有没有觉得,发展到现在 , 软件开发行业是越来越成熟了,无论是过程管理、架构方法、设计方法,还是语言、平台、框架、工具等,都发展到了一个前所未有的高度,相关思想和理念也日臻完善,我们真正进入了一个最好的时代 。
单就编程语言来说,近些年包括Scala(2003)、Groovy(2003)、Go(2009)、Kotlin(2011)、Swift(2014)等新兴编程语言如雨后春笋版涌现出来,也给我们带来了很多让人眼前一亮的编程特性 , 甚至Java这等老牌编程语言也是不断推陈出新,编程再也不像过去那般枯燥 。
本篇就带大家一起感受一下现代编程语言那些激动人心的特性 。
这个特性其实有点早了,但是也是很早就让人感动的语言特性了 , 熟悉Javascript的同学应该对它很了解 。Javascript语言具有动态性 , 我们可以随时为类的某个实例添加方法,也可以利用动态原型 , 为类的所有实例添加方法,有没有感觉扩展类的实现变得非常方便了呢?
扩展和原型很像,允许我们在不修改或继承类的情况下,将新的函数方法添加到原类中 。这个特性较早见于C#这门语言,目前在Kotlin、Swift中均可以看到 。这里顺便说一下C#,当时C#出来的时候,不得不说很多特性是非常棒的 , 包括扩展方法、泛型、分部类等等,比Java好不要太多 。像Kotlin,不仅可以扩展类的方法,还可以扩展类的属性 。
前两个都是关于扩展代码的,这里再来一个 。我们知道Java 1.8以来,接口interface里的方法可以有自己的默认实现了,大大方便了实现类 , 减少了重复代码 。相对于Java的这个实现是显示的,Go语言的接口实现可以是隐式的,添加隐式实现后 , 所有继承的结构(Go没有类,都是结构struct)都可以调用这个方法,和前面的两个特性有异曲同工之妙,下面我们对比看一下 。
C语言就有宏的概念,通过 #define 定义,然后在代码中进行替换 。宏作为Rust语言的高级特性,可以操作语法单元,是一种通过编写代码来生成代码的方式 , 被称作“元编程”(meta programming) 。相对于函数 , 宏可以接受任意多个参数,可以减少重复代码,定义DSL 。宏语法比较复杂,难以编写和调试,以至于在Rust文档中说,宏将是其最后的特性 。
当你回想写代码枯燥的时候,应该会想到为字段编写getter、setter吧?较早的时候,C#就意识到了这个问题,贴心地推出了自动属性这个语法糖 。而Java开发者则是通过Eclipse、IDEA这样的开发工具来自动生成getter、setter代码 。当然 , 现在也可以依赖Lombook包,使用lombok的注解@Getter @Setter来编译时生成相关代码 。
据说空指针异常是软件业最贵的异常,价值10亿美元 。你有没有为处理调用链中的null值而烦恼过?又或者被伤害过?Kotlin会在编译期提示对可能为null变量的不安全使用,也提供了Elvis 操作符 ?: 来方便地处理null值 。而有了可选链,就舒服多了 。可选链语法应该较早出现在JavaScript语言中,新兴语言Swift也提供了这一省心的特性 。Swift英明地决定变量是不允许直接存储NIL值 , 当然也提供了optionals的装箱功能允许将NIL或其它值包装起来,方便有时使用 。
输入乃万恶之源 , 函数首要的事情就是检查不规范和不安全的输入,这也是卫语句的来历 。Swift语言为此提供了专门的卫语句语法,有了它的贴身防护,整个代码都干爽多了,剧烈运动都不怕,不信往下瞧:
如果要评选最酷的语言特性,那么Lambda表达式必须获得提名 。Lambda表达式很早就出现在Lisp语言中,python也有,在后来的C#语言大放异彩 , 又一次狠狠地羞辱了不长进的Java,而Java也终于在1.8版本后加入了这一特性,甚至C++ 11也光荣地上车了 。

推荐阅读