6.1.3 创建结构体

除了索引运算符".",Octave 还可以使用动态命名"(var)"struct函数来创建结构体。动态命名使用变量的字符串值作为字段名。例如:

a = "field2";
x.a = 1;
x.(a) = 2;
x
     ⇒   x =
        {
          a =  1
          field2 =  2
        }

动态索引还允许您使用任意字符串,而不仅仅是有效的 Octave 标识符(请注意,这在 MATLAB 上不适用):

a = "long field with spaces (and funny char$)";
x.a = 1;
x.(a) = 2;
x
     ⇒   x =
        {
          a =  1
          long field with spaces (and funny char$) =  2
        }

可以启用警告 ID Octave:language-extension 来提醒这种用法。请参阅 警告 ID

更实际地,所有对字符串进行操作的函数都可以用来在将字段名存入数据结构之前构建正确的字段名。

names = ["Bill"; "Mary"; "John"];
ages  = [37; 26; 31];
for i = 1:rows (names)
  database.(names(i,:)) = ages(i);
endfor
database
     ⇒   database =
        {
          Bill =  37
          Mary =  26
          John =  31
        }

创建结构体的第三种方法是使用struct命令。struct接受成对的参数,其中每对中的第一个参数是要包含在结构体中的字段名,第二个参数是标量或元胞数组,表示要包含在该结构体或结构体数组中的值。例如:

struct ("field1", 1, "field2", 2)
⇒   ans =
      {
        field1 =  1
        field2 =  2
      }

如果传递给struct的值是标量和元胞数组的混合,那么标量参数会被扩展,以创建具有一致维度的结构体数组。例如:

s = struct ("field1", {1, "one"}, "field2", {2, "two"},
        "field3", 3);
s.field1
     ⇒ 
        ans =  1
        ans = one

s.field2
     ⇒ 
        ans =  2
        ans = two

s.field3
     ⇒ 
        ans =  3
        ans =  3

如果要创建一个结构体,其中某个字段本身包含一个元胞数组,则必须将该元胞数组再包一层,如下例所示:

struct ("field1", {{1, "one"}}, "field2", 2)
     ⇒   ans =
        {
          field1 =

        {
          [1,1] =  1
          [1,2] = one
        }

          field2 =  2
        }
 
s = struct ()
s = struct (field1, value1, field2, value2, …)
s = struct (obj)

创建一个标量或数组结构体并初始化其值。

field1field2……等变量是指定字段名称的字符串,value1value2……等变量可以是任何类型。

如果这些值是元胞数组,则创建一个结构体数组并初始化其值。每个元胞数组的维度必须匹配。单元素元胞和非元胞值会被重复填充,以填满整个数组。如果元胞数组为空,则使用指定的字段名称创建一个空结构体数组。

如果参数是一个对象,则返回其底层的结构体。

注意,该语法是针对结构体数组进行了优化。请考虑以下示例:

struct ("foo", 1)
  ⇒   scalar structure containing the fields:
    foo =  1

struct ("foo", {})
  ⇒   0x0 struct array containing the fields:
    foo

struct ("foo", { {} })
  ⇒   scalar structure containing the fields:
    foo = {}(0x0)

struct ("foo", {1, 2, 3})
  ⇒   1x3 struct array containing the fields:
    foo

第一种情况是一个普通的标量结构体——一个字段,一个值。第二种情况则创建了一个空的结构体数组,因为它传入的是表示结构体数组值的空元胞数组。当该值是一个包含单个元素的元胞数组时,它会变成一个标量结构体,该单个元素作为字段的值。而这个单个元素恰好是一个空的元胞数组。

最后,如果该值是一个非标量元胞数组,那么struct会生成一个结构体数组

另请参阅: cell2structfieldnamesgetfieldsetfieldrmfieldisfieldorderfieldsisstructstructfun

函数isstruct可用于测试一个对象是否为结构体或结构体数组。

 
tf = isstruct (x)

如果 x 是结构体或结构体数组,则返回 true。

另请参阅: ismatrixiscellisa


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

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