第一类对象(First-class Object)

In programming language design, a first-class citizen (also object, entity, or value) in a given programming language is an entity which supports all the operations generally available to other entities. These operations typically include being passed as a parameter, returned from a function, and assigned to a variable.

第一类对象(First-class Object)在1960年由Christopher Strachey发明,原来称之为第一类公民(First-class citizen),意思是指函数能够做为电脑中的第一类公民。英文中也称之为First-class entity或First-class value。 编程

定义

第一类对象不必定是指面向对象程序设计中所指的对象,而是指程序中的全部实体(好比:变量、函数、队列、字典等等)。通常第一类对象具备一下特征: 数组


  1. 能够被存入变量或其余结构
  2. 能够被做为参数传递给其余方法/函数
  3. 能够被做为方法/函数的返回值
  4. 能够在执行期被建立,而无需在设计期所有写出
  5. 有固定身份


“固有身份”是指实体有内部表示,而不是根据名字来识别,好比匿名函数,还能够经过赋值叫任何名字。大部分语言的基本类型的数值(int, float)等都是第一类对象;可是数组不必定,好比C中的数组,做为函数参数时,传递的是第一个元素的地址,同时还丢失了数组长度信息。对于大多数的动态语言,函数/方法都是第一类对象,好比Python,可是Ruby不是,由于不能返回一个方法。第一类函数对函数式编程语言来讲是必须的。 编程语言

范例

在大多数语言中,数值和基础类型都是第一类对象,然而不一样语言中对函数的区别很大,例如C语言与C++中的函数不是第一类对象,由于在这些语言中函数不能在执行期创造,而必须在设计时所有写好。相比之下,Scheme中的函数是第一类对象,由于能够用lambda语句来创造匿名函数并做为第一类对象来操做。 函数式编程

举个例子

在诸如Python、Scala等函数式编程语言中,最主要的基础是λ演算(lambda caculus),而λ演算的函数能够接受函数看成输入输出。所以,这类编程语言每每实现了第一类函数(First-class Function),以Scala为例。 函数

Scala,顾名思义“可伸缩的”,为了使λ演算变得简洁,Scala实现了第一类值(First-class Value),即全部函数都是first-class values ,这意味着Scala中的全部函数都是值,所以,函数能够做为值同样进行参数传递或者从函数中返回。
做为返回,结果为2
val inc = (x : Int) => x + 1
inc(1)
做为传递,结果为List(2,3,4)
List(1, 2, 3).map((x: Int) => x + 1) spa

从以上结果能够看出,函数是在执行期被建立的;函数能够是匿名的;有返回值;可以被存储;函数做为实体知足了第一对象概念的定义。 设计

历史背景 对象

第一类对象和第二类对象的概念,在1960年由Christopher Strachey引入。实际上他没有提出严格的术语定义,而是给出了Algol语言中实数和过程的对比: 队列

第一类对象和第二类对象。在Algol程序语言中,一个“实数”可能会出如今一个表达式中或被赋给一个变量,并可能在过程调用中做为实际参数出现。而“过程”只可能会出如今另外一个过程调用中,最多见的是做为操做符,有时候也做为实参。除此以外,没有表达式会涉及到过程,或者将过程做为计算结果。所以在某种意义上,在Algol程序语言中的过程是第二类变量,它们老是会单独出现,不可能被一个表达式或一个变量表示(形式参数除外)…
一些编程语言中容许函数在执行时建立,并将其称为”第一类“(First-class),而函数在C语言中不是第一类对象;相对应的称之为第二类对象(second-class objects),由于从函数角度看这类对象是独立的而且能在各类形式操做。像SmallTalk这种全面向对象语言,函数和方法都是第一类对象,由于操做符(+、-、etc)也是对象,所以操做符也是第一类对象。
相关文章
相关标签/搜索