Domanda

perldoc -f benedica :

  

bless REF,CLASSNAME

     

Questa funzione dice al thingy a cui fa riferimento REF che ora è
          un oggetto nel pacchetto CLASSNAME.

C'è un modo per ottenere una struttura unblessed senza copiare inutili?

È stato utile?

Soluzione

dati :: Struttura :: Util

  

unbless($ref)

     

Rimuovere la benedizione di tutti gli oggetti trovati all'interno della struttura di dati passata.

#!/usr/bin/perl

use strict; use warnings;

use Scalar::Util qw( refaddr );
use Data::Structure::Util qw( unbless );

my $x = bless { a => 1, b => 2 } => 'My';

printf "%s : %s\n", ref $x, refaddr $x;

unbless $x;

printf "%s : %s\n", ref $x, refaddr $x;

Output:

My : 237356
HASH : 237356

Altri suggerimenti

dati :: Struttura :: Util ha una funzione unbless che lo farà per te. Come Erik sottolinea, JSON :: XS non accetterà normalmente riferimenti benedetti (anche se Vorrei che sarebbe semplicemente ignorare che e trattare con la struttura dei dati). Non c'è niente da fare in questo caso.

Ma prendere in considerazione perché pensi che è necessario unbless esso. State facendo questo per una delle vostre classi o di una classe diversa? Questo suona sospettosamente come la cosa sbagliata da Do. Ci potrebbe essere un modo migliore.

Hai lo stesso problema di rottura incapsulamento perché si deve supporre che si sa quale sia la struttura interna del riferimento è. Se avete intenzione di farlo, si può semplicemente ignorare la roba orientata agli oggetti e accedere direttamente alla struttura.

Se avete intenzione di fare questo per la propria classe, considerare di fornire un metodo per restituire una struttura di dati (che non deve essere la struttura originale) invece di cambiare l'oggetto.

Lei parla in un commento di follow-up che si potrebbe fare questo per aggirare alcuni comportamenti Template Toolkit. Ho avuto questa situazione in due modi a seconda della situazione:

  • Solo passare i dati necessari al modello anziché l'intero oggetto.
  • Aggiungi i metodi per l'oggetto per ottenere i dati desiderati nel modello.

Perl è DWIM, ma TT è anche DWIMmier, che a volte è un peccato.


Ecco un trucco veloce dove mi definisco un TO_JSON in UNIVERSAL quindi si applica a tutti gli oggetti. Si fa una copia completa, unblesses, e restituisce la struttura di dati.

#!perl
use v5.10;

sub UNIVERSAL::TO_JSON {
    my( $self ) = shift;

    use Storable qw(dclone);
    use Data::Structure::Util qw(unbless);

    my $clone = unbless( dclone( $self ) );

    $clone;
    }

my $data = bless {
    foo => bless( [], 'Local::Array' ),
    quack => bless( {
        map { $_ => bless [$_, $_**2], 'Local::Array' } 
            grep { is_prime } 1 .. 10
        }, 'Local::Hash' ),
    }, 'Local::Hash';

use JSON::XS;
my $jsonner = JSON::XS->new->pretty->convert_blessed(1);
say $jsonner->encode( $data );

Se si sa che cosa il vostro oggetto è sostenuta da, si potrebbe fare questo senza usare pacchetti.

Hash

$obj = bless {}, 'Obj';
print ref $obj, "\n";
$obj = { %$obj };
print ref $obj, "\n";

Array

$obj = bless [], 'Obj';
print ref $obj , "\n";
$obj = [ @$obj ];
print ref $obj, "\n";

Scalar

$obj = bless \$a, "Obj";
print ref $obj, "\n";
$obj = \${ $$obj };
print ref $obj, "\n";

Acme :: Curse :)

Aggiornamento: Grazie, Ivan! Ho mescolato moduli. In realtà ho voluto dare un link a Acme :: Accidenti :))

P. . S Acme :: Starnuto :)

P. P. S. Non ha una vera utilità, che è per questo che è Acme::. Vedi post di Brian.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top