Liam W
封面

何谓编程语言中的头等对象?

作者
王亮·发表于 3 年前

我是在去年学习 React 函数式编程才知道编程言语有个叫“头等对象”的概念,那时候草草地记了笔记,今天整理一下分享给大家。相信很多没有学过函数式编程的同学可能都还不知道“头等对象”是什么。看完本文可能对你学习函数式编程有帮助。

头等对象(First-class Object),或者叫第一类对象。历史上头等对象起先是叫“头等公民(First-class Citizen)”,后面渐渐被称为头等实体(First-class Entity)或头等值(First-class Value)。

满足下面三个特点的对象就可以称为头等对象:

① 可以被存入变量或其他结构

② 可以被作为参数传递给其它函数

③ 可以被作为函数的返回值

大部分语言的基本类型的对象(如:int, string 等)都是头等对象,所以头等对象定义的引入对基本类型没有什么意义。它的意义主要在于区分编程言的函数的特征,所有编程语言的函数都有“是不是头等对象”这个特征。比如,JavaScript、C#、Python、Scala 的函数是头等对象,C、C++、Ruby 的函数不是头等对象。

所有基于函数式设计的语言(如 Scala),它们的函数都是头等对象,大部分动态语言(如 JavaScript、Python)的函数也是头等对象。

用 C# 来举个例子吧。

Func<int, int> triple = x => x * 3;
var range = Enumerable.Range(1, 2);
var triples = range.Select(triple);
// triples => [3, 6]

这里的 triple 就是一个函数的变量,它有返回值,并且可以传递给其它函数,满足头等对象的特征。

再来一个 JavaScript 的例子。

var triple = x => x * 3
var range = [1, 2]
var triples = range.map(triple)
// triples => [3, 6]

道理和上面的 C# 一样,不再累述。