转至:概念理解#1 第一类公民(First-class Citizen)

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. – Wikipedia

意思是说,第一类公民、第一类对象(不特指面向对象里的”对象”)、第一类实体、第一类值(这些概念都是一个,只是叫法不同)是支持其他实体所有操作的实体。这里有两个地方要展开:
实体与其他实体
通常实体是指各种各样的数据类型和值,比如对象、类、函数、字面量等,一般讨论都是指函数是不是第一类对象(first-class object)。
操作(这些实体所具有的操作有):

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

这个概念是1960s中期Christopher Strachey提出的,虽然没有严格定义,他对比了Algol中的实数(real numbers)和子程序(procedures):
First and second class objects. In Algol, a real number may appear in an expression or be assigned to a variable, and either may appear as an actual parameter in a procedure call. A procedure, on the other hand, may only appear in another procedure call either as the operator (the most common case) or as one of the actual parameters. There are no other expressions involving procedures or whose results are procedures. Thus in a sense procedures in Algol are second class citizens—they always have to appear in person and can never be represented by a variable or expression (except in the case of a formal parameter)…

Algol中,实数可以出现在表达式,或者被赋值给一个变量,两者(表达式,变量)都可以作为实际参数传递给子程序调用。但是子程序,只能作为一个操作数或者一个实际参数出现在另一个子程序调用中。没有表达式与子程序有关联,表达式的返回值也不能是子程序。所以从某种意义上来说,Algol中的子程序是二等公民,它们只能独自出现,不能被一个变量或者表达式表示(除非是形式参数)…
从这段历史背景里可以看出,第一类(first-class)与第二类(second-class),是借助于社会学概念中的一等和二等,来表示不同实体出现的位置(可以进行的操作)是不对等的。后来还出现了第三类和第四类公民,但是没有广泛传播。

Python示例:

def speak():print "first-class function"#1 函数可以被赋值
parle = speak
parle()def people(action):action()#2 函数可以作为参数传递给函数
people(speak)def parent_do():def child_do():print "child function"return child_do#3 函数可以作为返回值从函数返回
#4 函数可以在运行时动态创建
do_func = parent_do()
do_func()f1 = lambda x: x + 1
f2 = lambda x: x + 1#5 函数有固有身份
print (f1 == f2)

第一类公民(First-class Citizen)相关推荐

  1. 概念理解#1 第一类公民(First-class Citizen)

    2019独角兽企业重金招聘Python工程师标准>>> In programming language design, a first-class citizen (also obj ...

  2. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

  3. 公民实验室:史上危险的手机间谍软件已感染45个国家/地区

    原文地址:https://www.hackeye.net/securityevent/16360.aspx 根据公民实验室(Citizen Lab)的一份最新报告显示,在过去的两年时间里,被认为是世界 ...

  4. 星际公民服务器位置,《星际公民》3.0测试服务器上线 游戏实际内容展示

    Youtube用户Xenthor Xi公布了一段视频,展示了长达一小时的<星际公民>(Star Citizen)3.0游戏实际内容.目前<星际公民>3.0已经上线测试服务器,第 ...

  5. Go 语言中的一等公民:看似普通的函数,凭什么?

    大家好,我是煎鱼. 在 Go 语言中,一提函数,大家提的最多的就是 "Go 语言的函数是一等公民".这个定义来的非常突然,我们先了解一下什么是一等公民,他又凭什么? 根据维基百科的 ...

  6. 作为一等公民的 Python 函数

    文章目录 参考 描述 一等公民 概念 Python 中的一等公民 一切皆对象 人人平等 作为一等公民的 Python 函数 作为函数的参数进行传递 作为函数的返回值进行返回 作为数据结构中的元素 能够 ...

  7. 编程语言中,何谓“一等公民”

    一等公民,First-Class Citizen,此处 Citizen 可换为 object / value / entity 等词.所谓"一等公民"即指在程序中可无限使用的对像( ...

  8. 【历史上的今天】11 月 16 日:RISC-V 掌门人出生;微软发布 Windows CE;电子管问世

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2022 年 11 月 16 日,在 1892 年的今天,郭沫若诞生:郭沫若是我国知名的作家.历史学家和考古学家, ...

  9. 【历史上的今天】11 月 16 日:RISC-V 领导者出生;微软发布 Windows CE;电子管问世

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 11 月 16 日,在 1892 年的今天,郭沫若诞生:郭沫若是我国知名的作家.历史学家和考古学家, ...

最新文章

  1. 玩聚的Blog墙 VIII
  2. git push github SSL报错处理
  3. NSLog中格式符列表
  4. linux shell if语句使用方法
  5. USNews世界大学排名! CS引争议!中国高校霸榜:清华第一,北邮反超CMU
  6. Qt读取ini文件中文乱码问题
  7. Android NDK开发之 Android系统开发中LOG的使用
  8. java数据读取容量,spring batch使用reader读数据的内存容量问题详解
  9. 学硬件设计,需要看哪些书籍?
  10. 代理记账公司能够为企业客户提供哪些服务
  11. python下载urllib3_使用urllib3下载网页
  12. cubemx配置usb
  13. (求助)RPC failed;curl 56 GnuTLS recv error(-9): A TLS packet with unexpected length was received
  14. android 盈利模式
  15. C#操作Word模板文件 替换并重新生成
  16. 02-CSS基础与进阶-day5_2018-09-03-21-41-57
  17. 《JavaScript 正则表达式迷你书》知识点小抄本
  18. 100个python算法超详细讲解:猜牌术
  19. flink keyby指定key方式详解
  20. Cucumber之五Cucumber Options详解

热门文章

  1. Android 11来了,快!扶我起来
  2. [全流程案例]壮汉:3.头部雕刻(ZBrush)
  3. 浙江大学计算机推免保研,浙江大学计算机科学与技术学院数字化艺术与设计保研细则...
  4. UML 2.0修成正果
  5. 飞桨中国行——生产制造专场
  6. [zt] SAP 标准教材和自学方法
  7. 『Nginx』Nginx单双机热备方案实现
  8. 真实故事:他用了3天时间写个程序,日入30万
  9. QQ引流怎么搞?怎么用QQ来引流?QQ引流的技巧
  10. 杭州新生每日一问:天天洗头会导致脱发吗