¿Es posible la autorreferencia en MATLAB?
packages self-reference (3)
Entonces ... ¿esto no requiere importar también para ser importado? ¿O importa esto es una función que siempre tienes en tu camino?
Parece apenas más complejo pegar un bloque "importar esto" con esto en la parte superior de cada función, y entonces no tiene que preocuparse por importar si está en su camino. Tiendo a sentir que confiar en el camino es peligroso.
"Importar este" bloque
%% Import own package
[~, pkgdir] = fileparts(fileparts(mfilename(''fullpath'')));
import([pkgdir(2:end) ''.*'']);
Incluso puede colocarlo en un bloque try / catch para asegurarse de que esté en un directorio de paquetes, y decidir qué hacer si no lo está.
%% Import own package
try
[~, pkgdir] = fileparts(fileparts(mfilename(''fullpath'')));
import([pkgdir(2:end)''.*'']);
catch err
if ~strcmp(err.identifier,''MATLAB:UndefinedFunction''), rethrow(err); end
end
Como se observa here , las funciones en paquetes, así como los métodos estáticos en las clases, todavía necesitan usar una sintaxis de nombre de packagename.functionname
o import packagename.*
Para cada función (ya que las importaciones son parte del espacio de trabajo de la función y no global). Esto significa que cambiar el nombre del paquete / clase más adelante puede convertirse en una molestia tediosa.
¿Hay alguna forma de hacer algo como
import this.*
, Es decir, un método agnóstico de nombre de paquete / clase para acceder a todas las funciones / métodos estáticos en el mismo paquete / clase?
Esta probablemente no es una respuesta digna de recompensa, pero como no tienes ninguna respuesta, ¡pensé que la publicaría de todos modos! Puede invocar métodos estáticos a través de una instancia de la clase que solo necesitaría definir una vez. Puede invocar funciones a través de un controlador de función, pero esto requeriría un identificador por función.
Usando estas técnicas, puede definir todas sus referencias estáticas de métodos y funciones en un solo lugar. Entonces usarías estas referencias en todo tu paquete. Entonces, si decidió cambiar el nombre del paquete en un momento posterior, solo necesitaría actualizar estas referencias que están todas almacenadas en un solo lugar.
Ver:
También puede invocar métodos estáticos utilizando una instancia de la clase, como cualquier método:
obj = MyClass;
value = obj.pi (.001);
El siguiente ejemplo crea un identificador de función para la función jorobas y lo asigna a la variable fhandle.
fhandle = @humps;
Recientemente me encontré con un problema similar y encontré la siguiente solución para paquetes. Sin embargo, es MUY raro.
Usted crea una función llamada import this con un argumento opcional.
function to_eval = importthis(exclude_list)
if nargin == 0
exclude_list = [];
end
var_name = genvarname(''A'', exclude_list); %avoid shadowing
to_eval = [''[~,''...
, var_name...
, '']=fileparts(fileparts(mfilename(''''fullpath'''')));''... %get containing dir
, ''eval([''''import '''',''...
, var_name...
, ''(2:end),''''.*'''']);''... %remove ''+''
, ''clear ''... %clean up
, var_name
];
end
Esta función devuelve una cadena que luego puede eval
que importa el paquete "this". Entonces, en las funciones de su paquete colocaría lo siguiente cerca de la parte superior:
function B = myfunc(A)
eval(importthis);
%function body
end
También puede pasar a who
importhis
, dejando limpio el espacio de nombres de su función.
function B = myfunc(A)
eval(importthis(who));
%function body
end
No puedo decidir si debería sentirme orgulloso o discutido por lo que hice.