playbook/docs/tsl/syntax/24_builtin_runtime_objects.md

167 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Builtin Runtime Objects
文档类型:语法主线
是否可直接用于生成代码:仅部分
是否含已验证可执行示例:是
是否含已验证反例:否
遇到不确定时跳转到:[23_object_runtime_and_introspection.md](23_object_runtime_and_introspection.md)、[30_runtime_services_and_global_cache.md](30_runtime_services_and_global_cache.md)、[12_pitfalls.md](12_pitfalls.md)
手册位置:第 24 篇,共 32 篇。上一篇:[23_object_runtime_and_introspection.md](23_object_runtime_and_introspection.md)。下一篇:[25_set_operations.md](25_set_operations.md)。
这一篇只收当前解释器下已经实际跑通的运行时内置对象最小模型。这里讲的是语言运行时对象,不是金融业务 API。
## 这一篇解决什么问题
回答“写普通 TSL/TSF 脚本时,哪些内置对象可以直接创建,最小可用接口是什么,哪些对象其实依赖特定运行上下文”。
## 必须记住的规则
- 当前 CLI 里,`TStringList` 已验证可以直接 `CreateObject("TStringList")` 创建。
- `TStringList` 当前已验证支持数字下标、字符串键下标、`Count` 和 `Add(...)`
- 流对象应先按 `TStream` 家族理解;当前 CLI 里最小可靠入口是 `TMemoryStream` 这种具体类型。
- 当前 CLI 里,直接 `CreateObject("TStream")` 会失败,错误信息包含 `function:tstream compile error or not found`
- `TMemoryStream` 当前已验证支持 `Write(...)`、`Read(...)`、`Position`、`Size`。
- `TCipher` 当前不是“无参即可创建”的对象;`CreateObject("TCipher")` 会失败。
- `TCipher` 当前已验证可用的最小写法是 `CreateObject("TCipher", 2)`,然后设置 `Password` 再做 `Encrypt(...)` / `Decrypt(...)`
- `TWebRequest``TWebResponse` 在当前 CLI 环境里没有通过直接 `CreateObject(...)` 的最小样例。
- 因此WEB 请求 / 响应对象不要直接写进普通命令行脚本模板;它们应视为特定运行上下文对象。
## 已验证语法
### `TStringList`
代码块身份:已验证可执行示例
```tsl
program test;
begin
obj := CreateObject("TStringList");
obj.CommaText := "A=aaa,B=bbb,C=222";
WriteLn(obj[1]);
WriteLn(obj["B"]);
WriteLn(obj.Count);
obj.Add("D=444");
WriteLn(obj.Count);
end.
```
已验证运行结果:
- 依次输出 `B=bbb`、`bbb`、`3`、`4`
- 说明当前既可以按数字下标取整行,也可以按键名取 `Name=Value` 里的值
### `TStream` 家族的最小可靠入口:`TMemoryStream`
代码块身份:已验证可执行示例
```tsl
program test;
begin
mem := CreateObject("TMemoryStream");
buffer := "ABC";
mem.Write(buffer, 3);
mem.Position := 0;
outbuf := "xxx";
mem.Read(outbuf, 3);
WriteLn(outbuf);
WriteLn(mem.Size);
try
base := CreateObject("TStream");
WriteLn(ifObj(base));
except
WriteLn("TStreamError");
WriteLn(ExceptObject.ErrInfo);
end;
end.
```
已验证运行结果:
- 前两行输出 `ABC`、`3`
- 后两行输出 `TStreamError`,以及包含 `function:tstream compile error or not found` 的错误信息
- 说明当前 CLI 里应优先使用 `TMemoryStream` 这类具体流对象,不要把裸 `TStream` 当成可直接创建对象
### `TCipher`
代码块身份:已验证可执行示例
```tsl
program test;
begin
try
bad := CreateObject("TCipher");
WriteLn("NoArg");
WriteLn(ifObj(bad));
except
WriteLn("NoArgError");
WriteLn(ExceptObject.ErrInfo);
end;
cipher := CreateObject("TCipher", 2);
cipher.Password := "Tinysoft";
enc := cipher.Encrypt("abc");
WriteLn(enc <> "abc");
WriteLn(cipher.Decrypt(enc));
end.
```
已验证运行结果:
- 前两行输出 `NoArgError`,以及包含 `New Class tcipher Error.` 的错误信息
- 后两行输出 `1`、`abc`
- 说明 `TCipher` 当前必须按“带模式参数创建”来写,随后可稳定走 `Password -> Encrypt -> Decrypt`
### `TWebRequest` / `TWebResponse` 的 CLI 边界
代码块身份:已验证可执行示例
```tsl
program test;
begin
try
req := CreateObject("TWebRequest");
WriteLn("ReqOk");
WriteLn(ifObj(req));
except
WriteLn("ReqError");
WriteLn(ExceptObject.ErrInfo);
end;
try
resp := CreateObject("TWebResponse");
WriteLn("RespOk");
WriteLn(ifObj(resp));
except
WriteLn("RespError");
WriteLn(ExceptObject.ErrInfo);
end;
end.
```
已验证运行结果:
- 先输出 `ReqError`,随后错误信息包含 `function:twebrequest compile error or not found`
- 再输出 `RespError`,随后错误信息包含 `function:twebresponse compile error or not found`
- 说明当前 CLI 环境下WEB 请求 / 响应对象不能直接按普通 `CreateObject(...)` 脚本对象来写
## 暂不在本页展开的对象
- `TFileStream`
- `TIniFile`
- `TMemIniFile`
- `THashedStringList`
- `TRSA`
- `FTP` / `SMTP` / `POP3`
- `MailMsg` / `MessagePart`
- `TCookie` / `TCookieCollection`
- `TSessionMan` / `TSession`
这些对象旧资料里都出现过,但当前这一篇先只保留“新 session 最容易直接用到”的最小主干。需要把其中某个对象升级进主线正文时,应先补最小脚本再写结论。
## 跳转指引
- 回看对象主线:见 [09_objects_and_classes.md](09_objects_and_classes.md)
- 看对象运行时反射:见 [23_object_runtime_and_introspection.md](23_object_runtime_and_introspection.md)
- 看运行时服务与缓存:见 [30_runtime_services_and_global_cache.md](30_runtime_services_and_global_cache.md)
- 看对象重载与遍历:见 [32_object_overloads_and_iteration.md](32_object_overloads_and_iteration.md)