I metodi di una classe sono un tipo di chiusura?

5

Per MDN

A closure is a special kind of object that combines two things: a function, and the environment in which that function was created. The environment consists of any local variables that were in-scope at the time that the closure was created.

Sulla base di questa affermazione è accettabile chiamare i metodi in una classe con accesso alle variabili globali un tipo di chiusura?

Sembra che la descrizione soddisfi i requisiti, poiché un metodo è ovviamente una funzione per un'istanza di classe e ha accesso alle variabili di classe che sono, in un certo senso, locali al metodo.

    
posta tt9 29.12.2015 - 00:32
fonte

4 risposte

3

Are a class's methods a type of closure?

No. Una chiusura è un tipo di funzione molto specifico. Come dice Wikipedia, implementano lo scope lessicale .

Chiusure

In Python, una tale chiusura sarebbe simile a questa:

def startAt(x):
    def incrementBy(y):
        return x + y
    return incrementBy

La variabile x è vincolata (nel caso di Python, immutabilmente) nella incrementBy che viene creata quando viene chiamato startAt . ( x potrebbe molto bene essere una struttura dati mutevole, o l'implementazione della tua lingua potrebbe permetterti di cambiarla.)

Per contrasto, ecco un esempio di funzione senza chiusura che utilizza un globale:

x = 0
def incrementBy(y):
    return x + y

Qui c'è una singola funzione, incrementBy , e ogni volta che x cambia sull'ambito globale, si riflette nella funzione:

>>> incrementBy(5)
5
>>> x = 1
>>> incrementBy(5)
6

Metodi

I metodi, d'altra parte, hanno accesso a variabili mutabili. Se sono metodi di istanza, conoscono la loro istanza e quindi la classe. Se sono metodi di classe, conoscono la loro classe. Anche se si tratta di metodi statici, non conoscendo la classe o l'istanza, possono ancora utilizzare le globali. I globals possono essere riassegnati a piacere e possono quindi modificare gli output della funzione per ogni dato.

puoi fare una chiusura in un metodo aggiunto a una classe, a seconda dell'implementazione della tua lingua:

class Foo(object):
    ib5 = staticmethod(startAt(5))

>>> Foo.ib5(3)
8
>>> Foo.ib5
<function incrementBy at 0x7f29e978b758>

Ma non penso che sia ciò che intendi veramente fare.

Che cos'è una chiusura?

Una chiusura è una funzione interna che lega le variabili ad essa dall'ambito della funzione esterna. Se il metodo di una classe non lo fa, non è una chiusura.

Metodi di confronto e contrasto e chiusure

Ciò che hanno in comune, è la combinazione di funzionalità con i dati.

Dove contrastano le chiusure collegano i dati alla funzionalità, mentre i metodi legano la funzionalità alle strutture di dati. Quindi non sarebbe corretto chiamare un metodo un tipo di chiusura a meno che non sia realmente una chiusura.

Direi che molti metodi della classe non lo fanno, ma permetterò che ci possano essere ambienti in cui questa è una tecnica riconosciuta. Sarei molto interessato a sapere chi sta usando questo e qual è la loro giustificazione. Personalmente non l'ho mai visto fare in natura.

    
risposta data 29.12.2015 - 03:29
fonte
2

Penso che quello che stai chiedendo sia se i metodi statici e le variabili statiche della stessa classe possano essere considerati come un costrutto di chiusura (forse di una persona povera).

Sebbene abbia qualche somiglianza con l'operazione di una chiusura, il costrutto che stai descrivendo non può essere creato e ricreato a piacimento (a meno che tu non contenga il lancio del programma come creazione della chiusura, che è un po 'inverosimile. )

La creazione e più istanze concorrenti è una funzionalità prevista per le chiusure: nel testo che stai citando, ad esempio, l'articolo mostra makeAdder , che viene utilizzato per creare due diverse chiusure che coesistono.

Il meccanismo di classe statica non può essere creato o istanziato (esiste solo originariamente), quindi avresti difficoltà a ricreare l'esempio di makeAdder usandolo.

    
risposta data 29.12.2015 - 00:51
fonte
1

Sì, ma le variabili globali non hanno nulla a che fare con questo.

Una chiusura è una funzione che racchiude lo stato da un ambito esterno. Questo stato incluso è persistente e più di una funzione può racchiudere lo stesso insieme di dati di stato.

Un oggetto, d'altra parte, è un insieme di variabili di stato con funzioni ad esso associate che (se si utilizza l'incapsulamento) hanno accesso privilegiato a quello stato.

In altre parole, un oggetto è una chiusura e una chiusura è un oggetto. Sono due modi diversi di guardare lo stesso concetto di base: lo stato e le funzioni associate legate insieme. L'unica differenza è come la guardi. Una chiusura enfatizza le funzioni molto di più, mentre un oggetto tende a mettere maggiormente l'accento sui dati, ma i due sono in realtà la stessa cosa. In effetti, i linguaggi orientati agli oggetti implementano quasi sempre le chiusure perché il compilatore le trasforma in speciali classi di oggetti e i linguaggi funzionali tendono a implementare oggetti avvolgendo più chiusure attorno allo stesso insieme di dati di stato.

    
risposta data 01.01.2016 - 02:51
fonte
0
  • Una funzione chiusa all'interno di una funzione.
  • La chiusura è una funzione che può essere memorizzata come una variabile con in una funzione.
  • La chiusura può riferirsi a qualsiasi variabile locale della funzione esterna.

Are a class's methods a type of closure?

I metodi di classe

non soddisfano i principi di base di cui sopra, quindi i metodi semplici con la classe non sono chiusi.

per esempio le classi anonime in java sono vicine ad essere chiamate come chiusura. Domanda SO

Origine: tardo medio inglese: dal vecchio francese, dal tardo latino clausura, dal claus- 'chiuso'

    
risposta data 29.12.2015 - 00:53
fonte

Leggi altre domande sui tag