• 现代编程语言最有趣的 10 大特性


    dev-reading/fe 是一个阅读、导读、速读的 repo,不要依赖于 dev-reading/fe 学习知识。本 repo 只是一个快速了解文章内容的工具,并不提供全文解读和翻译。你可以通过本平台快速了解文章里面的内容,找到感兴趣的文章,然后去阅读全文。

    本文讨论地址:github.com/dev-reading…

    阅读时间大概 2 分钟


    如今大多数“现代”语言都依然使用老旧的 C-style 语法。

    我们看一下编程语言的年代:Lisp (1958)、Smalltalk (1972)、Objective-C (1984)、Haskell (1990)、OCaml (1996)、等等。这些都是上个世纪的语言了。

    本文作者选择了几个最新的语言:Reason、Swift、Kotlin、Dart 作为研究对象,总结了 10 个特性:

    1 管道操作符 Pipeline operator

    Reason 语法

    let newScore = me.score
      |> double
      |> (it) => add(7, it)
      |> (it) => boundScore(0, 100, it);复制代码

    对应的 JavaScript 写法:

    boundScore(0, 100, add(7, double(me.score)));复制代码

    而 es 也已经有了对应的提案:tc39/proposal-pipeline-operator

    2 模式匹配 Pattern matching

    Kotlin 语法

    when (x) {
        in 1..10 -> print("x is in the range")
        in validNumbers -> print("x is valid")
        !in 10..20 -> print("x is outside the range")
        else -> print("none of the above")
    }复制代码

    3 Reactive (Rx) programming build in the language

    Dart 语法

    input.onKeyDown                                              
      .where((e) => e.ctrlKey && e.code == 'Enter')              
      .forEach((e) => dispatch(addTodoAction(e.target.value)));复制代码

    4 lambda 函数的默认参数

    Kotlin 语法(使用 it 作为默认参数)

    strings
      .filter{ it.length == 5 }
      .map{ it.toUpperCase() }复制代码

    对比 JavaScript

    strings
      .filter{ it => it.length === 5 }
      .map{ it => it.toUpperCase() }复制代码

    5 解构 Destructuring

    Reason 语法:

    let someInts = (10, 20);
    let (ten, twenty) = someInts;

    type person = {name: string, age: int};
    let somePerson = {name: "Guy", age: 30};
    let {name, age} = somePerson;复制代码

    Kotlin 语法

    data class Person(val name: String, val age: Int)
    val(name, age) = Person("Guy", 20)复制代码

    es6 已经有了数组解构,es8 增加了对象解构

    6 操作符级联 Cascade operator

    Dart 语法

    querySelector('#button') // Get an object.
      ..text = 'Confirm' // Use its members.
      ..classes.add('important')
      ..onClick.listen((e) => dispatch(confirmedAction()));复制代码

    对应的 JavaScript 写法

    var button = querySelector('#button');
    button.text = 'Confirm';
    button.classed.add('important');
    button.onClick.listen((e) => dispatch(confirmedAction()));复制代码

    如果使用 jQuery 基本在写法上就和 dart 一致了,但是两者有本质的不同

    7 if 表达式 If expressions

    Kotlin 语法

    val result = if (param == 1) {
        "one"
    } else if (param == 2) {
        "two"
    } else {
        "three"
    }复制代码

    对于 if 表达式有人喜欢,有人讨厌,有人觉得无所谓;我是非常喜欢的,我之前在知乎有个回答:www.zhihu.com/question/55…

    8 Try expressions

    Kotlin 语法

    val result = try {
        count()
    } catch (e: ArithmeticException) {
        throw IllegalStateException(e)
    }复制代码

    9 自动科里化 Automatic currying

    Reason 语法:

    let add = (x, y) => x + y;   /* same as (x) => (y) => x + y; */
    let five = add(2,3);         /* 5 */
    let alsoFive = add(2)(3);    /* 5 */
    let addFive = add(5);        /* y => 5 + y; */
    let eleven = addFive(6);     /* 11 */
    let twelve = addFive(7);     /* 12 */复制代码

    10 方法扩展 Method extensions

    Swift 语法:

    extension Int {
        func repetitions(task: () -> Void) {
            for _ in 0..<self {
                task()
            }
        }
    }
    
    3.repetitions({
        print("Hello!")
    })
    // Hello!
    // Hello!
    // Hello!复制代码

    JavaScript 可以在原型上扩展。

    我觉得还有要给非常有用的特性,optional-chaining。之所以没有提到,是因为大多数语言都已经有这个特性了吧,看来 JavaScript 还是发展太慢啊。。。


    阅读原文:Ten interesting features from various modern languages

    讨论地址:现代编程语言最有趣的 10 大特性

    如果你想参与讨论,请点击这里

  • 相关阅读:
    iOS 调试心得
    一步一步带你安装史上最难安装的 vim 插件
    20 行代码极速为 App 加上聊天功能
    在通知栏上玩游戏,Steve iOS 游戏实现思路
    ThinkPHP 3.2.x 集成极光推送指北
    MkDocs 文档生成逻辑浅析
    极光推送的角标问题
    聊天界面-自适应文字
    Python3.7源码包编译安装
    Navicat远程连接MySQL数据库
  • 原文地址:https://www.cnblogs.com/twodog/p/12138157.html
Copyright © 2020-2023  润新知