¿Cómo se llama esta forma de alcance? [duplicate]

2 minutos de lectura

avatar de usuario
vikingosegundo

Más o menos por accidente me topé con esta forma de alcance

DataSource *dataSource =({
    NSInteger idx = [[self.tableView indexPathForSelectedRow] row];
    DataSource *dataSource = [DataSource new];
    dataSource.address = self.destinations[idx][0];
    dataSource.name    = self.destinations[idx][1];
    dataSource;
});

Creo que es una buena manera de crear y crear instancias de objetos y variables, ya que las variables temporales solo vivirán mientras sean necesarias para crear el objeto que realmente necesito y cuido. En el código de arriba idx se irá tan pronto como escriba el interior dataSource al exterior dataSourceya que el alcance se dejará poco después.
También encuentro atractivo el hecho de que un objeto completamente instanciado y configurado se establecerá en el objeto externo.
En realidad, ni siquiera sé si se trata de una característica de C o de Objective-C o un dulce de sintaxis agregado a clang.


@Unheilig
esta es una sintaxis para organizar código. no es algo así como un bloqueo o un cierre. al final del código, solo tiene un objeto completamente instanciado y configurado.

Esto es útil si necesita un objeto solo para pasarlo como argumento a un método, pero la configuración de ese objeto requiere más de una declaración. En lugar de asignarlo a una variable temporal local, puede pasar una expresión de declaración.

[[MYViewController alloc] initWithDataSource:({
    NSInteger idx = [[self.tableView indexPathForSelectedRow] row];
    DataSource *dataSource = [DataSource new];
    dataSource.address = self.destinations[idx][@"address"];
    dataSource.name    = self.destinations[idx][@"name"];
    dataSource;
})];

En un entorno que no sea ARC, incluso podría llamar a autorelease dentro de la declaración de expresión.

Entonces, supongo que se trata solo de organización del código y mucho gusto personal.

  • Espero que te haya funcionado bien hasta ahora. ¿Podría citar un escenario en el que esto podría ser útil? ¿Cómo lo llamarías/invocarías? Gracias por adelantado.

    – Unheilig

    13 de enero de 2014 a las 2:54

  • @Unheilig, mira mi edición

    – vikingosegundo

    13 de enero de 2014 a las 9:00

avatar de usuario
gwendal roué

Es una extensión de GCC, llamada “expresión de declaración”, descrita en http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html.

  • Realmente debería agregar las partes pertinentes de esa URL en su respuesta en caso de que el enlace se rompa alguna vez.

    – Código Maverick

    5 de febrero de 2014 a las 21:55

  • @CodeMaverick: la respuesta es suficiente en mi opinión. Pregunto por el nombre, Gwendal me lo dio. adicionalmente dice que es una extensión GCC. Es una respuesta perfecta.

    – vikingosegundo

    13 de febrero de 2014 a las 12:35

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad