Forward optional args to another function
    25 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    memam
 el 3 de Jun. de 2022
  
    
    
    
    
    Editada: Julian Hapke
      
 el 6 de Jul. de 2022
            Hi Matlab Community,
can you help me out with the following problem:
func1(obj, arg1, options)
            arguments
                obj 
                arg1 string
                options.x string = "" 
                options.y string = ""
            end
    func2(arg1, options)
end
func2(obj, arg1, options)
            arguments
                obj 
                arg1 string
                options.x string = "" 
                options.y string = ""
            end
end
% func1("a", x="b", y="c")
% Throws: Invalid argument at position 2. Function requires exactly 2 positional input(s).
How to pass a struct with optional arguments to another function?
Thanks in advance
2 comentarios
  Rik
      
      
 el 3 de Jun. de 2022
				I never work with the argument block, so I don't have a clear answer for you.
How would you pass a struct as an input anyway with the arguments block?
Respuesta aceptada
  Julian Hapke
      
 el 6 de Jul. de 2022
        
      Editada: Julian Hapke
      
 el 6 de Jul. de 2022
  
      there is
namedargs2cell
in the examples they use it for forwarding of name-value arguments.
0 comentarios
Más respuestas (1)
  Rik
      
      
 el 3 de Jun. de 2022
        
      Editada: Rik
      
      
 el 3 de Jun. de 2022
  
      This is a terrible cludge. There must be a better way. If you don't find it, feel free to use this. It uses the fact that the x="b" syntax is an extension of the normal NameValue syntax, which you can still use with a comma separated list. Be careful with struct arrays.
This will still work if there are more options in the lower option, but if you want them to be forwarded, they must be defined in the upper function.
func1(1,"a", x="b", y="c", z2="e")
func1(1,"a", x="b", y="c", z1="d")
function func1(obj, arg1, options)
arguments
    obj
    arg1 string
    options.x string = ""
    options.y string = ""
    options.z2
end
unwound_options=fieldnames(options);
unwound_options(:,2)=struct2cell(options);
unwound_options=reshape(unwound_options.',1,[]);
func2(obj, arg1,unwound_options{:})
end
function func2(obj, arg1, options)
arguments
    obj
    arg1 string
    options.x string = ""
    options.y string = ""
    options.z1 string = ""
    options.z2 string = ""
end
obj, arg1, options
end
2 comentarios
  Rik
      
      
 el 7 de Jun. de 2022
				I personally don't use the arguments block, so I don't know what the proper way would be. I personally just use my own functions to parse optional arguments. That also allows me to keep my code compatible with older releases and with GNU Octave.
If no other answer is posted with a better solution, please consider marking this one as accepted answer. While not perfect, it does work and accepting it may increase visibility for other people with a similar problem.
Ver también
Categorías
				Más información sobre Debugging and Analysis en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


