• [^] # Re: Mais pourquoi diantre pas de RAII ?

    Posté par (site web personnel) . En réponse à la dépêche De Zig et des zags. Évalué à 6.

    J'en rajoute une couche avec ce post de l'auteur de Zig

    RAII works fine in Zig

    Il semble considérer que le defer fait office de RAII. Mais c'est oublier que le defer s'exécute quand on quitte la fonction dans laquelle il a été déclaré. Du coup on ne peut pas retourner des objets avec destructeur.

    Par exemple:

    const std = @import("std"); 
    const LockGuard = struct {
     mutex: *std.Thread.Mutex,
     fn take(mutex: *std.Thread.Mutex) !LockGuard {
     std.debug.print("Lock!\n", .{});
     mutex.lock();
     return .{
     .mutex = mutex,
     };
     }
     fn release(lg: *LockGuard) void {
     std.debug.print("Unlock!\n", .{});
     lg.mutex.unlock();
     }
    };
    var m: std.Thread.Mutex = .{};
    fn take_lock() !LockGuard {
     var lk = try LockGuard.take(&m);
     defer lk.release();
     return lk;
    }
    pub fn main() !void {
     std.debug.print("taking lock!\n", .{});
     var guard = try take_lock();
     std.debug.print("lock taken {}!\n", .{guard});
    }
    

    va retourner (vous pouvez aller sur https://zig-play.dev/ pour jouer avec):

    taking lock!
    Lock!
    Unlock!
    lock taken [...] !

    alors qu'un langage supportant le RAII n'aurait libéré le lock que quand guard n'est effectivement plus référencé, c'est à dire à la fin de la fonction main !

    Et puisque maintenant c'est Vendredi, je vous laisse avec la justification pour fermer l'issue pour faire du vrai RAII en Zig ;-)