【问题标题】:Cell Array of Player Objects Not Printing All Fields玩家对象的元胞数组未打印所有字段
【发布时间】:2015-11-02 23:50:25
【问题描述】:

我写了一个基本的类定义如下:

classdef player

    properties
        team
        name
        rating
        ranking
    end

    methods
    end

end

我得到了一个名为allPlayers 的玩家对象元胞数组,其中除了排名之外的每个字段都已设置。然后我在上面调用下面的函数:

function setRankings(players)
    for i = 1 : length(players)
        players{i}.ranking = i;
    end
end 

此时,应该设置每个播放器对象的所有字段。我调用下面的函数来显示每个字段:

function displayPlayers(players)
    for i = 1 : length(players)
       current = players{i};
       disp(['Name: ', current.name]);
       disp(['Team: ', current.team]);
       disp(['Rating: ', current.rating]);
       disp(['Ranking: ', current.ranking]);
    end
end 

不幸的是,每个玩家都打印如下(只是一个例子):

'Name: '    'Shleifer,Sam'

Team: Yale
    'Rating: '    '5.050000'

Ranking:

所以看起来排名字段实际上并不是由setRankings 设置的。

这是为什么?

【问题讨论】:

  • 排名未设置,因为player 是一个值类,而不是句柄,并且您没有从函数返回修改后的对象。区别的简要说明是available here
  • 我很荣幸成为这个问题的一部分

标签: matlab


【解决方案1】:

要获得您想要的行为,您必须使您的类成为“处理”类——而不是“价值”类。有关更多信息,请参阅此link

这是怎么做的:

classdef player < handle

    properties
        team
        name
        rating
        ranking
    end

    methods
    end

end

请注意,您也可以使用 value class,但在这种情况下,您必须在 setRanking 中返回新的玩家列表。

【讨论】:

  • 太好了,谢谢!知道为什么排名会设置为字符而不是整数吗?我表示我的范围从 1 到长度(玩家),所以我有点迷茫。再次感谢!
  • disp(['Ranking: ', num2str(current.ranking)]
猜你喜欢
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多