help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Built-in Functions inside method of a class


From: Carnë Draug
Subject: Re: Built-in Functions inside method of a class
Date: Mon, 10 Oct 2011 23:14:22 +0100

On 10 October 2011 20:55, John W. Eaton <address@hidden> wrote:
> On  9-Oct-2011, Juan Pablo Carbajal wrote:
>
> | Are built in functions called inside a method of a class considered as
> | friends (as in C++) of that class?
> | In other words: Will the function be evaluated in the context of the
> | caller or in the context of the method.
> |
> | I have a class with a field 'Path' that is a structure with many
> | fields inside. I have a method that is meant to return a cell
> | containing information inside those subfields. The following code
> | works correctly
> |
> | wanted_ids = {ids{tf}};
> | for i = 1: numel (wanted_ids)
> |      paths{i} = obj.Path.(ids{i}).data;
> | end
> |
> | by returning the cell with the contents of the subfields of Path
> | described in 'wanted_ids'.
> |
> | However any of the following doesn't work
> | % Variation
> | paths = cellfun (@(s) obj.Path.(s).data,wanted_ids,'UniformOutput',false);
> | % Another variation
> | paths = cellfun (@(s) getfield (obj,'Path').(s).data,
> | wanted_ids,'UniformOutput',false);
> | % Yet another
> | paths = cellfun (@(s) getfield (obj.Path,s).data,
> | wanted_ids,'UniformOutput',false);
> | % Yet yet another
> | dummy = @(s) obj.Path.(s).data;
> | paths = cellfun (dummy, wanted_ids,'UniformOutput',false);
> |
> | The error says that the class cannot by indexed with 'Path'. If one
> | manually gives this interface to the class, by defining a case in
> | subref 'Path' the problem is solved. However, this breaks the privacy
> | of the class field 'Path', that is not meant to be accessed directly.
>
> I don't know whether this is a bug or not.  Can you please post a
> complete example that can be used to reproduce the problem?

I have attached an example that repoduces this. I believe that inside
methods the built-in subsref and subsasgn should be used. However, if
cellfun is used inside a method, the class subsref will be used
instead. The following code has a simple method that runs the same
code inside a for loop and then using cellfun. In the end shows that
the results will also be different

octave-3.4.2:16> a = testClass;
octave-3.4.2:17> testMethod(a);
The following will use built-in susbref because it's inside a method
The following will use class susbref because it's in a function
I am in the class subsref
I am in the class subsref
loop_result =
{
  [1,1] =
  {
    [1,1] =  1
    [1,2] =  2
    [1,3] =  3
  }
  [1,2] =
  {
    [1,1] =  1
    [1,2] =  2
    [1,3] =  3
  }
}
cellfun_result =
{
  [1,1] = <class testClass>
  [1,2] = <class testClass>
}

Attachment: @testClass.tar.gz
Description: GNU Zip compressed data


reply via email to

[Prev in Thread] Current Thread [Next in Thread]