跳到主要内容
版本:release

空类型(nil,void)

1 简述

本章主要介绍空类型 voidnil 的含义,默认值,使用场景及少量注意事项。

本章内容主要面向 GS 编程初学者或需要简单了解或回顾 GS 空类型的同学。

在阅读本章后应类型 voidnil 的含义,使用场景及使用的注意事项。

2 nil 类型

nil是一个表示​​空值​​的标识符,用于表明指针或引用类型的变量当前未指向或引用任何有效的对象或内存地址。它主要作为使用。

2.1 nil 的赋值与默认值

在 GS 中,除了基本的 int和 float类型,许多类型的变量都可以被赋予 nil值,表示其“空”或“未初始化”的状态。例如:

string str = nil;
buffer buf = nil;
array arr = nil;
map m = nil;
function func = nil;
handle han = nil;
raw_pointer ptr = nil;
write(str, buf, arr, m, func, han, ptr);

示例 2-1:接收空值nil示例 输出结果如下:

nilnilnilnilnilnilnil

需要注意的是nil本身​​不能​​作为类型用于声明变量。尝试使用 nil作为类型会导致编译错误,示例如下:

nil val;

示例 2-2:错误使用nil类型声明变量 报错输出如下:

Illegal statement

对于许多可接受 nil值的引用类型,如果声明时未显式初始化,其默认值就是 nil:

string str;
buffer buf;
array arr;
map m;
function func;
handle han;
raw_pointer ptr;
write(str, buf, arr, m, func, han, ptr);

示例 2-3:未初始化变量的默认nil值 输出结果如下:

nilnilnilnilnilnilnil

2.2 操作 nil 的风险

尝试对值为nil的变量进行数据操作(如调用方法、访问成员)是一种常见错误,通常会导致运行时异常,因为 nil表示无效的引用示例如下:

array arr;
arr.push_back(1);

示例 2-4:非法 nil操作 报错输出如下:

Bad type of argument 1, expected 'array', got 'nil'.

2.3 可空值类型 (int? 和 float?)

基本的intfloat类型是值类型,通常不能直接赋值为nil。为了允许这些数值类型也能表示“空”或“缺失”的概念,GS 提供了可空值类型,记为int?float?。示例如下:

int? a = nil;
float? b = nil;
int? c;
float? d;
write(a," ",b," ",c," ",d);

示例 2-5:int?float?类型变量接收nil值 结果输出如下:

nil nil 0 0.0

3 void 类型

void是一个关键字,主要用于表示​​没有类型​​或​​没有返回值​​。它主要作为​​类型系统​​中的概念使用。

3.1 void 作为函数返回类型

当函数不需要向调用者返回任何数据时,其返回类型应声明为 void。void作为函数返回类型的示例:

void hello()
{
writeln("Hello.");
}
mixed ret = hello(); // 函数调用,返回值赋给 mixed 类型变量
write(ret); // 输出返回值

示例 3-1:无返回值函数的 void 声明 示例的输出结果如下

Hello.
(void)

3.2 void 不能用于声明变量

void表示“无类型”,编译器无法为其分配确定大小的内存,因此​​不能​​用于声明变量,示例如下:

void val;

示例 3-2:错误的使用void类型声明变量
报错结果如下:

error C1999: Invalid variable type, can not be void or nil.

3.3 获取与接收 void

由于void表示“无类型”,只有能容纳任何类型的mixed类型变量可以接收void值。尝试用特定类型(如string)的变量接收void值会导致类型不匹配错误。

void get_void()
{

}
string try_accept_void = get_void();

示例 3-3:错误的以非mixed类型接收void
报错结果如下:

Assign type mismatched, expected 'string' got 'void'.

void类型​​不提供任何常量值​​。要获取void值,唯一的方式是通过调用返回类型为void的函数。

void get_void()
{

}
write(get_void());

示例 3-3:正确的获取void
输出结果如下:

(void)

4 空类型条件判断

在条件表达式中(如 if语句),nil和 void值都被视为​​条件不成立​​(假),示例如下:

void get_void()
{

}
mixed void_val = get_void();
mixed nil_val = nil;
if(void_val)
writeln("I am void");
else if(nil_val)
writeln("I am nil");
else
writeln("Both conditions were false.");

示例 4-1:空类型条件判断
示例的输出结果为空,如下:

Both conditions were false.

可以看到两个 if 语句的执行条件均为成立。

5 总结

恭喜你完成了空类型 nil和 void的学习!本章深入探讨了它们的核心区别:nil是一个表示​​空值​​的标识符,主要用于引用类型,表示“未指向任何有效对象”;而 void是一个表示​​无类型​​的关键字,主要用于函数返回类型,表示“不返回任何值”。记住 nil是一个你可以使用的值,而 void更多是类型系统的一个约束标记。务必警惕对 nil值的非法操作,并在使用可空类型时注意其默认值行为。接下来继续进行int float​​数值类型​的学习。