Closures

6 respostas
edymrex

O que é closures …?
procurei no google mas não encotrei uma definição alguém sabe do que se trata…?

6 Respostas

Abdon

Em algumas liguagens um closure pode ser definido quando uma função, cria funções interna (que podem ser utilizadas externamente), e ambas acessam as mesmas variaveis locais da função “pai”. Em runtime, um closure é formado quando as funções internas são apontadas a variaveis para ser chamadas em outro scopo. Assim podem acessar aquelas variaveis da “função pai”

Tem um exemplo a wikipedia que da para ver bem isto funfando:

var f, g;
function foo()
{
  var x = 0;
  f = function() { ++x; };
  g = function() { --x; };
  x = 1;
  print(f()); // "2"
}
foo();
//A variavel x é interna da função foo, so que aqui ela não existe, so que permanece o estado da mesma (variavel x, interna da função foo)
g(); // "1"
f(); // "2"

Referencia: http://en.wikipedia.org/wiki/Closure_(computer_science)

edymrex

valew cara

edymrex

Outro exemplo cara:

Pessoa=function()
		 {
		 	this.nome;
			
			this.getNome=function()
			{
				return this.nome;
			}
			
			this.setNome=function(nome)
			{
				this.nome=nome;
			}
		 }
		 
		 
		 chama=new Pessoa();
		 chama.setNome("Edson");
		 alert(chama.getNome())
peczenyj

Uma vantagem interessante dos closures é vc passar um bloco de codigo para um método.

A = [ 1 , 2 , 3]
A.each{ |x| puts "#{x} -> #{x**2}" }

1 -> 1
2 -> 4
3 -> 9

neste exemplo em ruby, o meu array A possui um método chamado each, que executa o bloco de código passado para cada elemento do vetor.

O bloco de código que eu passei equivale a uma função que recebe um parametro 'x' e imprime o valor de x e o seu quadrado.

Imagine que vc tem um array de objetos e envia um bloco de codigo que vai operar sobre cada objeto, ou então ordenar um array de acordo com um bloco de código informado, os exemplos são muitos -- mas parece estranho a primeira vista.

L

Tinha entendido de como usar a interface org.apache.commons.collections.Closure. Mas o conceito que a galera comenta eh mais ou menos do que a Interface faz.

cv1

Favor nao confundir closures com blocos e procs. Uma closure “acontece” apenas quando um valor definido internamente eh usado fora do contexto de onde ele se originou:

var foo = function() { return function() { return function() { return "closure!"; } } }()(); assert(foo == "closure");

No exemplo do peczenyj, por exemplo, nao existe uma closure, ja que o bloco passado pro each() faz o puts diretamente. Isso aqui seria uma versao com closures da mesma coisa:

a = [1,2,3] a.collect{|x| "#{x} = #{x+1}" }.each {|x| puts x}

Criado 24 de julho de 2007
Ultima resposta 26 de jul. de 2007
Respostas 6
Participantes 5