概念理解#1 第一类公民(First-class Citizen)
2019獨角獸企業重金招聘Python工程師標準>>>
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)轉載于:https://my.oschina.net/douxingxiang/blog/374629
總結
以上是生活随笔為你收集整理的概念理解#1 第一类公民(First-class Citizen)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转] Boost智能指针——scope
- 下一篇: NuGet 发布类库,依赖项的问题