Os métodos de uma classe são um tipo de fechamento?

5

Por 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.

Com base nesta afirmação, é aceitável chamar métodos em uma classe com acesso a variáveis globais como um tipo de fechamento?

Parece que essa descrição atende aos requisitos, já que um método é, obviamente, uma função para uma instância de classe e tem acesso às variáveis de classe que, em certo sentido, são locais para o método.

    
por tt9 29.12.2015 / 00:32
fonte

4 respostas

3

Are a class's methods a type of closure?

Não. Um encerramento é um tipo muito específico de função. Como diz a Wikipedia, eles implementam o escopo léxico .

Encerramentos

No Python, esse fechamento seria assim:

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

A variável x é ligada (no caso do Python, imutável) no incrementBy que é criado quando startAt é chamado. ( x poderia muito bem ser uma estrutura de dados mutável, ou a implementação do seu idioma pode permitir que você a altere.)

Por contraste, aqui está um exemplo de função sem fechamento que usa um global:

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

Aqui, há uma única função, incrementBy , e sempre que x muda no escopo global, isso é refletido na função:

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

Métodos

Os métodos, por outro lado, têm acesso a variáveis mutáveis. Se eles são métodos de instância, eles conhecem sua instância e, portanto, classe. Se eles são métodos de classe, eles conhecem sua classe. Mesmo que sejam métodos estáticos, não conhecendo classe ou instância, eles ainda podem usar globals. Os globais podem ser reatribuídos à vontade e podem, assim, alterar as saídas da função para qualquer dado.

Você pode fazer um encerramento em um método anexado a uma classe, dependendo da implementação do seu idioma:

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

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

Mas eu não acho que é isso que você realmente quer fazer.

O que é um fechamento?

Um encerramento é uma função interna que liga variáveis a ele a partir do escopo da função externa. Se o método de uma turma não fizer isso, não será um encerramento.

Métodos e fechamentos de comparação e contraste

O que eles têm em comum é combinar funcionalidade com dados.

Onde eles contrastam é os encerramentos ligam os dados à funcionalidade, enquanto os métodos vinculam a funcionalidade às estruturas de dados. Portanto, não seria correto chamar um método de um tipo de fechamento a menos que ele realmente seja um fechamento.

Eu diria que a maioria dos métodos de classe não faz isso, mas permitirei que haja ambientes em que essa seja uma técnica reconhecida. Eu ficaria muito interessado em saber quem está usando isso e qual a justificativa deles. Eu pessoalmente nunca vi isso sendo feito na natureza.

    
por 29.12.2015 / 03:29
fonte
2

Acho que o que você está perguntando é se os métodos estáticos e as variáveis estáticas da mesma classe podem ser considerados como um constructo de fechamento (talvez de uma pessoa pobre).

Embora tenha alguma semelhança com a operação de um encerramento, o constructo que você está descrevendo não pode ser criado e recriado à vontade (a menos que você conte o lançamento do programa como uma criação do fechamento, o que é um pouco improvável. )

A criação, e várias instâncias simultâneas, é um recurso esperado de fechamentos - no texto que você está citando, por exemplo, o artigo mostra makeAdder , que é usado para criar dois fechamentos diferentes que coexistem.

O mecanismo de classe estática não pode ser criado ou instanciado (ele simplesmente existe primordialmente), então você teria problemas para recriar o makeAdder exemplo usando-o.

    
por 29.12.2015 / 00:51
fonte
1

Sim, mas as variáveis globais não têm nada a ver com isso.

Um encerramento é uma função que inclui o estado de um escopo externo. Esse estado fechado é persistente e mais de uma função pode incluir o mesmo conjunto de dados de estado.

Um objeto, por outro lado, é um conjunto de variáveis de estado com funções associadas a ele (se o encapsulamento estiver sendo usado) tem acesso privilegiado a esse estado.

Em outras palavras, um objeto é um fechamento e um fechamento é um objeto. São duas maneiras diferentes de olhar para o mesmo conceito básico: estado e funções associadas unidas. A única diferença é como você olha para isso. Um fechamento enfatiza muito mais as funções, enquanto um objeto tende a enfatizar mais os dados, mas os dois são realmente a mesma coisa. Na verdade, as linguagens orientadas a objeto quase sempre implementam closures fazendo com que o compilador as transforme em classes de objetos especiais, e as linguagens funcionais tendem a implementar objetos agrupando vários closures em torno do mesmo conjunto de dados de estado.

    
por 01.01.2016 / 02:51
fonte
0
  • Uma função fechada dentro de uma função.
  • O encerramento é uma função que pode ser armazenada como uma variável em uma função.
  • O fechamento pode referir-se a qualquer uma das variáveis locais da função externa.

Are a class's methods a type of closure?

Os métodos da classe

não satisfazem os princípios básicos acima, portanto métodos simples com a classe não são encerrados.

por exemplo, as classes anônimas em java estão próximas de serem chamadas como encerramento. SO Question

Origem: inglês médio tardio: do francês antigo, do latim tardio clausura, do claus- "fechado"

    
por 29.12.2015 / 00:53
fonte