Hay otra utilidad caso para esto - la eliminación de variables intermedias cuando se llama a una función o método que puede devolver cero, que deseamos evitar llamar dos veces. Por ejemplo (Objective-C), supongamos que deseamos descomprimir un archivo en una matriz si existe, de lo contrario, devolveremos una matriz vacía.
- (NSArray*)hydrateBacklogFromFile:(NSString *path)
{
NSArray *backlog = @[];
NSData *backlogData = [NSData dataWithContentsOfFile:path];
if (backlogData)
{
backlog = [NSKeyedUnarchiver unarchiveObjectWithData:backlogData] ?: backlog;
}
return backlog;
}
Las alternativas son menos concisas.
- (NSArray*)hydrateBacklogFromFile:(NSString *path)
{
NSArray *backlog = @[];
NSData *backlogData = [NSData dataWithContentsOfFile:path];
if (backlogData)
{
NSArray *tempArray = [NSKeyedUnarchiver unarchiveObjectWithData:backlogData];
if (tempArray != nil)
{
backlog = tempArray;
}
}
return backlog;
}
O feas con múltiples retornos etc.
- (NSArray*)hydrateBacklogFromFile:(NSString *path)
{
NSData *backlogData = [NSData dataWithContentsOfFile:path];
if (backlogData)
{
NSArray *tempArray = [NSKeyedUnarchiver unarchiveObjectWithData:backlogData];
if (tempArray != nil)
{
return tempArray;
}
}
return @[];
}
Así que es azúcar sintáctico útil que me resulta bastante fácil de leer. Las desventajas son
Conversión implícita de un puntero a bool. Esta es una convención de larga data C , pero la mayoría de los idiomas modernos no lo permiten, lo que complica cualquier esfuerzo de portabilidad.
Como otros han dicho que también es una extensión no estándar, por lo que debe evitarse si la portabilidad es una consideración en absoluto.
¡Espera, qué ?! ... eso parece un error para mí. –
@Konrad - probablemente no. El comentario sugiere que la línea establece un valor predeterminado: si "max_cpus no está configurado, configure el valor predeterminado". – Mac
Si es legal, lo evitaría porque se parece demasiado a un error. Aquí tuvimos una gran discusión al respecto, demostrando que habría sido más claro usar la declaración if. –