#2020学习打卡##Go语言高级编程# 什么是第一类对象?

已邀请:

zkbhj - 凯冰科技站长

赞同来自:

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


闲话:很多资料把 first-class object 翻译成 “第一类对象”,我觉得还是翻译成 “一等对象” 比较好,因为它明显借用了英语中 “一等公民” first-class citizen 的说法。


 
第一类对象不一定是指面向对象程序设计中所指的对象,而是指程序中的所有实体(比如:变量、函数、队列、字典等等)。一般第一类对象具有一下特征: 
  • 可以被存入变量或其他结构
  • 可以被作为参数传递给其他方法/函数
  • 可以被作为方法/函数的返回值
  • 可以在执行期被创建,而无需在设计期全部写出
  • 有固定身份


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

在大多数语言中,数值和基础类型都是第一类对象,然而不同语言中对函数的区别很大,例如C语言与C++中的函数不是第一类对象,因为在这些语言中函数不能在执行期创造,而必须在设计时全部写好。相比之下,Scheme中的函数是第一类对象,因为可以用lambda语句来创造匿名函数并作为第一类对象来操作。
 
历史背景

第一类对象和第二类对象的概念,在1960年由Christopher Strachey引入。实际上他没有提出严格的术语定义,而是给出了Algol语言中实数和过程的对比。一些编程语言中允许函数在执行时创建,并将其称为”第一类“(First-class),而函数在C语言中不是第一类对象;相对应的称之为第二类对象(second-class objects),因为从函数角度看这类对象是独立的并且能在各种形式操作。像SmallTalk这种全面向对象语言,函数和方法都是第一类对象,因为操作符(+、-、etc)也是对象,因此操作符也是第一类对象。
 
参考文档:
https://en.wikipedia.org/wiki/Christopher_Strachey
https://blog.csdn.net/weixin_33907511/article/details/92439279
 

要回复问题请先登录注册