#1175 closed defect (fixed)
Accessing member information
| Reported by: | Pedro Gea | Owned by: | Víctor de Buen Remiro |
|---|---|---|---|
| Priority: | high | Milestone: | Mantainance |
| Component: | Kernel | Version: | head |
| Severity: | normal | Keywords: | |
| Cc: |
Description
Sería muy interesante disponer de un método para obtener el conjunto de nombres de los atributos de un nameblock y no tener que recurrir al artificio:
Set EvalSet(NameBlockToSet(nameblock), Name);
Quizá podría ofrecerse el listado de miembros con alguna estructura informativa de modo que pudiera luego filtrarse si es atributo o método es público oprivado, heredado o propio, etc.
Pudiendo hacerse fácilmente cosas como:
Set selection = Select(Members(nameblock), Real (Set member) {
member->Grammar=="Real" & member->Access=="Public"
});
Set EvalSet(selection, Text (Set member) { member->Name });
Change History (4)
comment:1 Changed 15 years ago by
comment:3 Changed 15 years ago by
| Resolution: | → fixed |
|---|---|
| Status: | new → closed |
Ya están creadas las nuevas funciones
Acceso a miembros de objetos
Set Members(NameBlock nameBlock)
Devuelve un conjunto con un registro de información acerca de cada uno de los miembros de un NameBlock mediante la estructura
@NameBlockMemberInfo {
Text Type,
Text Name,
Text Access,
Text DefinedAtClass,
Text Description
}
Ejemplos
//Si no es instancia DefinedAtClass siempre será la cadena vacía
Set Members(StdLib);
Class @A
{
Real x;
Real _f=1;
Real _.g=2;
Real fun(Real y) { (x*y)^_f-g_.g }
};
//Si es una instancia DefinedAtClass siempre nunca la cadena vacía
@A a = [[
Real x = 2
]];
Set Members(a);
//Si es una instancia ampliada DefinedAtClass puede ser vacía o no
@A b = [[
Real x = 2;
Real z = 765
]];
Set Members(b);
Acceso a miembros de clases
Set ClassMembers(Text className [, Real static=?] )
Devuelve un conjunto con un registro de información acerca de cada uno de los miembros de una clase. Si static==0 sólo se devolverán los registros acerca de elementos no estáticos. Si static==1 sólo se devolverán los registros acerca de elementos estáticos. En otro caso se devolverán todos los registros. La información se devuelve usando la estructura:
@ClassMemberInfo {
Real Static,
Real Method,
Text Declaration,
Text Name,
Text Access,
Text DefinedAtClass,
Text Description }
Ejemplos:
Set all = ClassMembers("@MultiTryMetropolis_ARIMA");
Set just_static = ClassMembers("@MultiTryMetropolis_ARIMA",1);
Set non_static = ClassMembers("@MultiTryMetropolis_ARIMA",0);

Probablemente sería adecuado disponer de un método de este tipo también con las clases, para acceder al menos a sus miembros (los miembros declarados como Static).
En este caso el método debería recibir el nombre de la clase. Algo como:
Set ClassMembers("@NombreDeLaClase");Yo diferenciaría este método "ClassMembers" que devuelve qué llamadas del tipo
@NombreDeLaClase::Miembroestán disponibles, de otro método: "InstanceMembers" que devolvería algo similar a lo que hace "Members" sobre un nameblock o instancia,devolviendo los miembros que tendrían sus instancias (incluidos los heredados).
Set InstanceMembers("@NombreDeLaClase"); // == Members(instanceOfNombreDeLaClase)