Hidden Key

Hidden Key

am 21.06.2007 13:06:40 von Ferry Bolhar

Hallo,

ich habe z.Z eine Anfrage in de.comp.lang.javascript laufen, in der es
darum geht, ob man bei einem Objekt Attribute definieren kann, die
man beim Iterieren über das Objekt nicht zurückbekommt. Man kann
sie nur direkt ansprechen (was die Kenntnis ihrer Namen voraussetzt).

Auf Perl umgelegt, würde das in etwa bedeuten:

my %obj = (a => 1, b => 2, _c => 3, _d => 4);
print "$_ = $obj{$_}\n" foreach keys %obj;

Es sollte dann nur "a = 1" und "b = 2" ausgegeben werden (wenn wir
festlegen, dass mit "_" beginnende Attribute als "intern" angesehen
werden).

Mir ist dzt. keine Möglichkeit bekannt, dieses Verhalten zu erreichen.
Das ginge ja nur über einen Callback, der von "keys" aufgerufen wird
und mittels Returnstatus anzeigt, ob das an ihn übergebene Attribut
zurückgeliefert werden soll oder nicht.

Oder habe ich da etwas übersehen?

Schöne Grüße aus Wien,

Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: Hidden Key

am 21.06.2007 13:31:57 von Frank Seitz

Ferry Bolhar wrote:

> ich habe z.Z eine Anfrage in de.comp.lang.javascript laufen, in der es
> darum geht, ob man bei einem Objekt Attribute definieren kann, die
> man beim Iterieren über das Objekt nicht zurückbekommt. Man kann
> sie nur direkt ansprechen (was die Kenntnis ihrer Namen voraussetzt).

In Javascript gibt es ein obskures Konzept, dass Properties
enumerable sein können oder nicht. Sind sie es nicht,
werden sie in for/in Loops nicht geliefert. Ich halte diese
Sache für ziemlich missraten.

> Auf Perl umgelegt, würde das in etwa bedeuten:
>
> my %obj = (a => 1, b => 2, _c => 3, _d => 4);
> print "$_ = $obj{$_}\n" foreach keys %obj;
>
> Es sollte dann nur "a = 1" und "b = 2" ausgegeben werden (wenn wir
> festlegen, dass mit "_" beginnende Attribute als "intern" angesehen
> werden).
>
> Mir ist dzt. keine Möglichkeit bekannt, dieses Verhalten zu erreichen.
> Das ginge ja nur über einen Callback, der von "keys" aufgerufen wird
> und mittels Returnstatus anzeigt, ob das an ihn übergebene Attribut
> zurückgeliefert werden soll oder nicht.
>
> Oder habe ich da etwas übersehen?

Ich bin der Meinung, das sollte die jeweilige Klasse, und nur diese,
entscheiden, was öffentliche Keys sind und was nicht.
Das geht dann so:

#!/usr/bin/perl -w

use strict;

package Object;

sub new {
my $class = shift;
return bless {@_},$class;
}

sub keys {
my $self = shift;
return grep { !/^_/ } keys %$self;
}

package main;

my $obj = Object->new(a =>1,b=>2,_c=>3,_d=>4);
print join("\n",$obj->keys),"\n";

__END__
a
b

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Hidden Key

am 21.06.2007 15:34:50 von papahuhn

Schau dir FETCH, FIRSTKEY und NEXTKEY zu Hashties in perldoc perltie an.

Ferry Bolhar schrieb:

> Mir ist dzt. keine Möglichkeit bekannt, dieses Verhalten zu erreichen.
> Das ginge ja nur über einen Callback, der von "keys" aufgerufen wird
> und mittels Returnstatus anzeigt, ob das an ihn übergebene Attribut
> zurückgeliefert werden soll oder nicht.