#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 14 years ago by
comment:3 Changed 14 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:
Yo diferenciaría este método "ClassMembers" que devuelve qué llamadas del tipo
@NombreDeLaClase::Miembro
está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).