Cosa si intende per "oggetto di prima classe"?


146

In una domanda recente , ho ricevuto suggerimenti per parlare, tra l'altro, dell'aspetto di JavaScript in cui le funzioni sono oggetti di "prima classe". Cosa significa "prima classe" in questo contesto, al contrario di altri oggetti?

EDIT (Jörg W Mittag): Exact Duplicate: "Che cos'è un costrutto di programmazione di prima classe?"


Risposte:


179

Per citare Wikipedia :

Nell'informatica, si dice che un linguaggio di programmazione supporti funzioni di prima classe (o letterale di funzione) se tratta le funzioni come oggetti di prima classe. In particolare, ciò significa che il linguaggio supporta la costruzione di nuove funzioni durante l'esecuzione di un programma, la loro memorizzazione in strutture di dati, il loro passaggio come argomenti ad altre funzioni e il loro ritorno come valori di altre funzioni.

Questa pagina lo illustra egregiamente:

Davvero, proprio come qualsiasi altra variabile

  • Una funzione è un'istanza del tipo di oggetto
  • Una funzione può avere proprietà e ha un collegamento al suo metodo di costruzione
  • È possibile memorizzare la funzione in una variabile
  • È possibile passare la funzione come parametro a un'altra funzione
  • È possibile restituire la funzione da una funzione

leggi anche il commento di TrayMan, interessante ...


11
Citare Wikipedia è bello e dandy, ma la descrizione è scritta in una lingua per scienziati e non per geek. Cosa diavolo significa tutto ciò? L'ultima frase in quella citazione è vagu.
Spoike,

1
@Spoike, true ... fornito risorsa javascript.
Sander Versluys,

16
Convenientemente un linguaggio che ha funzioni di prima classe ha anche funzioni di ordine superiore, invece di essere limitato alle funzioni di primo ordine, che escluderebbero le funzioni di prima classe. (Anche se di ordine superiore, non è possibile la prima classe.)
TrayMan

5
Non ho trovato nulla di poco chiaro nella citazione di Wikipedia, ma il collegamento aggiuntivo è eccellente.
ProfK

4
Il collegamento non funziona più (dopo circa 8 anni).
doubleOrt

47

La nozione di "funzioni di prima classe" in un linguaggio di programmazione fu introdotta dallo scienziato informatico britannico Christopher Strachey negli anni '60. La formulazione più famosa di questo principio è probabilmente nella struttura e interpretazione dei programmi per computer di Gerald Jay Sussman e Harry Abelson:

  • Possono essere nominati da variabili.
  • Possono essere passati come argomenti alle procedure.
  • Possono essere restituiti come risultato delle procedure.
  • Possono essere inclusi in strutture di dati.

Fondamentalmente, significa che puoi fare con le funzioni tutto ciò che puoi fare con tutti gli altri elementi nel linguaggio di programmazione. Quindi, nel caso di JavaScript, significa che tutto ciò che puoi fare con un numero intero, una stringa, una matrice o qualsiasi altro tipo di oggetto, puoi anche farlo con le funzioni.


14

Approvazione più completa della formulazione di Strachey-Sussman-Abelson. Quindi, se la tua lingua supporta un tale costrutto, hai una funzione come linguaggio di prima classe :)

var men = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
men.isSweetHeart = true;

var women = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
women.isSweetHeart = true;

var aliens = function (objectOfAdmiration) {
  return objectOfAdmiration();
};

function like(obj){
  if (obj.isSweetHeart) {
      return function (){ return "Holy TRUE!"}; 
  }
  else {
      return function (){ return "Holy CRAP!"};
  }
}

alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"

alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!" :)

//women(like(aliens)); //  Who knows? Life is sometimes so unpredictable... :)

In breve, qualsiasi cosa è un oggetto di prima classe se agisce nella lingua come una sorta di manipolazione dello stato di oggetto o tipo di oggetto. Semplicemente qualcosa su cui è possibile operare e trasmettere dichiarazioni e valutare contemporaneamente espressioni. O ancora più breve: quando puoi pensare a una funzione come a un oggetto che può essere ulteriormente invocato.


9

Le funzioni JavaScript sono funzioni di prima classe, il che significa che funzioni e oggetti sono trattati come la stessa cosa. Le funzioni possono essere memorizzate come variabili all'interno di un oggetto o di un array, nonché possono essere passate come argomento o restituite da un'altra funzione. Ciò rende la funzione "cittadini di prima classe in JavaScript"

JavaScript utilizza la sintassi della notazione letterale che rende difficile comprendere appieno il fatto che nelle funzioni JavaScript sono oggetti.

Per esempio..

var youObj1 = new Object();
// or
var youObj1 = {};

entrambe le declerazioni sono equivalenti. Usando newstiamo chiamando la funzione di costruzione di un oggetto. Inoltre usando {}(scorciatoia JavaScript chiamato letterali) stiamo chiamando la funzione di costruzione di un oggetto. {}è solo una rappresentazione più breve per creare un'istanza del costruttore.

La maggior parte delle lingue utilizza newparole chiave per creare un oggetto, quindi consente di creare un oggetto JavaScript.

var myFunction = new Function("a",  "b", 'return a_b');

Come vedi abbiamo creato una funzione per il nome dell'oggetto .

Creazione della stessa funzione nome oggetto usando l'espressione della funzione JavaScript.

var myFunction = function myFunction(a,b) {
    return a+b;
}

Qui andiamo appena creato una funzione nome oggetto.


9

In javascript le funzioni sono oggetti di prima classe perché possono fare molto di più di ciò che gli oggetti possono fare.

  • Una funzione è un'istanza di un tipo di oggetto.

Function instanceof Object //returns true

Come un oggetto, una funzione può avere proprietà e può avere un collegamento alla sua funzione di costruzione.

 var o = {}; // empty object 'o'
    o.a = 1 ; 
    o.b = 2 ; 

    console.log(o.a); // 1
    console.log(o.b); // 2 


    function foo(){};
    foo.a = 3 ; 
    foo.b = 4 ; 

    console.log(foo.a);  // logs 3
    console.log(foo.b);  // logs 4 

  • Le funzioni possono essere memorizzate in una variabile come valore.

  var foo = function(){}; 
    console.log(foo); // function(){}

  • Le funzioni possono essere passate come argomenti ad altre funzioni

function callback (foo){
      foo();
}

callback(function(){console.log('Successfuly invoked as an argument inside function callback')})

  • È possibile restituire una funzione da una funzione

 function foo(){
	    return function(){console.log('working!')};
    }

    var bar = foo();
    bar(); // working!

  • Può essere memorizzato in una variabile come riferimento.

    var sum = function (a,b){return a+b}  
    sum(4,4);


Un oggetto può fare anche questo.
doubleOrt

5

Test semplice Se riesci a farlo nella tua lingua (Python come esempio):

def double(x):
    return x*x

f = double

print f(5) #prints 25

La tua lingua tratta le funzioni come oggetti di prima classe.


3
Ma posso farlo in C ++: int due volte (int x) {return x << 1; } int (* f) (int) = due volte; std :: cout << (* f) (5) << std :: endl; Ciò significa che C ++ tratta le funzioni come oggetti di prima classe (con una sintassi divertente)?
Thomas L Holaday,

1
Fino a quando non puoi creare una funzione all'interno di una funzione, voglio dire di no.
cHao,

1
I puntatori a funzioni C supportano (una definizione molto limitata di) funzioni di prima classe ma le funzioni non sono oggetti. I puntatori a funzione in C non contengono stato o comportamento.
Steven Kramer,

2

Significa che le funzioni sono oggetti, con un tipo e un comportamento. Possono essere creati dinamicamente, passati come qualsiasi altro oggetto e il fatto che possano essere chiamati fa parte della loro interfaccia.


2

Significa che la funzione eredita effettivamente dall'oggetto. In modo che tu possa passarlo in giro e lavorarci come con qualsiasi altro oggetto.

In c # tuttavia è necessario astenersi da delegati o riflessioni per giocare con le funzioni. (recentemente è migliorato molto con le espressioni lambda)


2

La definizione sul sito di Mozilla è concisa e chiara. In accordo con loro,

In JavaScript, le funzioni sono oggetti di prima classe, perché possono avere proprietà e metodi come qualsiasi altro oggetto . Ciò che li distingue dagli altri oggetti è che le funzioni possono essere chiamate. In breve, sono oggetti funzione.

E

una funzione è un "sottoprogramma" che può essere chiamato dal codice esterno (o interno in caso di ricorsione) alla funzione. Come il programma stesso, una funzione è composta da una sequenza di istruzioni chiamate corpo della funzione. I valori possono essere passati a una funzione e la funzione restituirà un valore.


0

immagino che quando qualcosa è di prima classe in una lingua, significa che è supportato dalla sua sintassi piuttosto che da una libreria o da zucchero sintattico. ad esempio, le classi in C non sono di prima classe


0

Semplici in JavaScript, le funzioni sono oggetti di prima classe, cioè le funzioni sono del tipo Oggetto e possono essere utilizzate in un modo di prima classe come qualsiasi altro oggetto (String, Array, Number, ecc.) Poiché in realtà sono oggetti loro stessi. Possono essere “archiviati in variabili, passati come argomenti a funzioni, creati all'interno di funzioni e restituiti da funzioni

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.