[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>
}
@testClass.tar.gz
Description: GNU Zip compressed data
- Built-in Functions inside method of a class, Juan Pablo Carbajal, 2011/10/08
- Re: Built-in Functions inside method of a class, Juan Pablo Carbajal, 2011/10/10
- Built-in Functions inside method of a class, John W. Eaton, 2011/10/10
- Re: Built-in Functions inside method of a class,
Carnë Draug <=
- Re: Built-in Functions inside method of a class, Ben Abbott, 2011/10/10
- Re: Built-in Functions inside method of a class, Ben Abbott, 2011/10/10
- Message not available
- Re: Built-in Functions inside method of a class, Carnë Draug, 2011/10/10
- Re: Built-in Functions inside method of a class, Ben Abbott, 2011/10/10
- Re: Built-in Functions inside method of a class, Carnë Draug, 2011/10/10