6.1.4 操作结构体

下面给出了可以操作结构体字段的其他函数。

 
n = numfields (s)

返回结构体 s 的字段数量。

参见: fieldnames

 
names = fieldnames (struct)
names = fieldnames (obj)
names = fieldnames (javaobj)
names = fieldnames ("javaclassname")

返回一个字符串元胞数组,其中包含指定输入中的字段名称。

当输入是一个结构体 struct 时,names 是结构体的元素。

当输入是一个 Octave 对象 obj 时,names 是对象的公共属性。

当输入是一个 Java 对象 javaobj 或包含 Java 类名称的字符串 javaclassname 时,names 是该对象或类的公共字段(数据成员)。

参见: numfields, isfield, orderfields, struct, properties

 
tf = isfield (x, "name")
tf = isfield (x, name)

如果 x 是一个结构体并且包含名为 name 的元素,则返回 true。

如果 name 是一个字符串元胞数组,则返回一个等维度的逻辑数组。

参见: fieldnames

 
sout = setfield (s, field, val)
sout = setfield (s, sidx1, field1, fidx1, sidx2, field2, fidx2, …, val)

返回结构体 s 的一个副本,其中字段成员 field 被设置为值 val

例如:

s = struct ();
s = setfield (s, "foo bar", 42);

这等价于

s.("foo bar") = 42;

请注意,普通的结构体语法 s.foo bar = 42 不能在此处使用,因为字段名称中含有空格字符,不是有效的 Octave 标识符。对字段名使用任意字符串与 MATLAB 不兼容,如果启用了警告 ID Octave:language-extension,则会发出警告。请参见 warning_ids

使用第二种调用形式,可以设置结构体数组的字段。输入 sidx 选择结构体数组的一个元素,field 指定所选元素的字段名称,fidx 选择字段中的哪个元素(在数组或元胞数组的情况下)。sidxfieldfidx 输入可以重复使用,以处理嵌套的结构体数组元素。结构体数组索引和字段元素索引必须是元胞数组,而字段名称必须是字符串。

例如:

s = struct ("baz", 42);
setfield (s, {1}, "foo", {1}, "bar", 54)
⇒ 
  ans =
    scalar structure containing the fields:
      baz =  42
      foo =
        scalar structure containing the fields:
          bar =  54

该示例从一个普通的标量结构体开始,并向其中添加了一个嵌套的标量结构体。在所有情况下,如果结构体索引 sidx 未指定,则默认为 1(标量结构体)。因此,上面的例子可以更简洁地写为 setfield (s, "foo", "bar", 54)

最后,一个包含嵌套结构体数组的示例:

sa.foo = 1;
sa = setfield (sa, {2}, "bar", {3}, "baz", {1, 4}, 5);
sa(2).bar(3)
⇒ 
  ans =
    scalar structure containing the fields:
      baz =  0   0   0   5

这里 sa 是一个结构体数组,其元素 1 和 2 处的字段依次是另一个结构体数组,该结构体数组的第三个元素是一个简单的标量结构体。最内层的标量结构体有一个包含矩阵值的字段。

请注意,可以通过以下方式获得与上述示例相同的结果:

sa.foo = 1;
sa(2).bar(3).baz(1,4) = 5

参见: getfield, rmfield, orderfields, isfield, fieldnames, isstruct, struct

 
val = getfield (s, field)
val = getfield (s, sidx1, field1, fidx1, …)

从结构体或嵌套结构体 s 中获取名为 field 的字段的值。

如果 s 是结构体数组,则 sidx 选择结构体数组的一个元素,field 指定所选元素的字段名称,fidx 选择字段中的哪个元素(在数组或元胞数组的情况下)。有关语法的更完整描述,请参见 setfield

参见: setfield, rmfield, orderfields, isfield, fieldnames, isstruct, struct

 
sout = rmfield (s, "f")
sout = rmfield (s, f)

返回结构体(数组)s 的一个副本,其中移除了字段 f

如果 f 是字符串元胞数组或字符数组,则移除所有指定的命名字段。

参见: orderfields, fieldnames, isfield

 
sout = orderfields (s1)
sout = orderfields (s1, s2)
sout = orderfields (s1, {cellstr})
sout = orderfields (s1, p)
[sout, p] = orderfields (…)

返回 s1 的一个副本,其中的字段按字母顺序排列,或按第二个输入指定的顺序排列。

如果只给定一个输入结构体 s1,则按字母顺序排列字段名称。

如果给出了第二个结构体参数,则将 s1 中的字段名称按照它们在 s2 中出现的顺序排列。第二个参数也可以是一个字符串元胞数组 cellstr,用于指定顺序。第二个参数还可以是一个排列向量。

可选的第二个输出参数 p 是一个排列向量,它将原始名称顺序转换为新的名称顺序。

示例:

s = struct ("d", 4, "b", 2, "a", 1, "c", 3);
t1 = orderfields (s)
  ⇒  t1 =
       scalar structure containing the fields:
         a =  1
         b =  2
         c =  3
         d =  4
t = struct ("d", {}, "c", {}, "b", {}, "a", {});
t2 = orderfields (s, t)
  ⇒  t2 =
       scalar structure containing the fields:
         d =  4
         c =  3
         b =  2
         a =  1
t3 = orderfields (s, [3, 2, 4, 1])
  ⇒  t3 =
       scalar structure containing the fields:
         a =  1
         b =  2
         c =  3
         d =  4
[t4, p] = orderfields (s, {"d", "c", "b", "a"})
  ⇒  t4 =
       scalar structure containing the fields:
         d =  4
         c =  3
         b =  2
         a =  1
     p =
        1
        4
        2
        3

参见: fieldnames, getfield, setfield, rmfield, isfield, isstruct, struct

 
s = substruct (type, subs, …)

创建一个用于 subsrefsubsasgn 的下标结构体。

例如:

idx = substruct ("()", {3, ":"})
  ⇒  idx =
       scalar structure containing the fields:
         type = ()
         subs =
         {
           [1,1] =  3
           [1,2] = :
         }
x = [1, 2, 3;
     4, 5, 6;
     7, 8, 9];
subsref (x, idx)
  ⇒    7   8   9

注意:关键字 end 不能在 subsrefsubsasgn 的索引赋值中使用。

参见: subsref, subsasgn


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2