资讯动态

Wing 标准库 String(str)类型 API 完全指南:从字符串操作到 JSON 安全转换

发布时间:2026/10/13 1:44:29 来源:尧图企业网站定制
编程语言编译器云原生语言运行时【免费下载链接】wingA programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡项目地址https://gitcode.com/gh_mirrors/wi/wing点击查看免费下载导读本文以 docs/api/04-standard-library/std/string.md 中定义的String类 API 为骨架系统讲解 Wing 语言内置字符串类型str的全部方法字符访问、子串查询、大小写转换、查找替换、拆分合并、去除空白以及将Json安全转换为str的静态方法fromJson。读完本文你将掌握str类型每一个方法的签名、参数语义、边界行为与典型用法并能借助仓库中的源码实现与测试用例理解其底层机制在编写云端应用如日志解析、请求参数校验、数据格式化时熟练运用。str是 Wing 语言的原生primitive类型之一在 docs/api/05-language-reference.md 中被描述为UTF-16 编码的字符串其完整 API 由 SDK 中的String类暴露给编译器语言层面通过wingType str注解将其绑定为str关键字见 packages/winglang/sdk/src/std/string.ts。一、字符串字面量与基础性质1.1 字符串字面量插值、多行与转义在 Wing 中字符串用双引号声明并且所有声明形式都支持多行。普通字符串内部会处理形如{expression}的表达式替换插值行为类似于 JavaScript 的text ${sub.prop}模板字符串同时支持 Unicode 转义序列在插值表达式内部与{可以通过反斜杠\转义。参见 docs/api/05-language-reference.mdlet name World; let s Hello, {name}!; let l s.length; // 11字符串连接也可以直接使用运算符与赋值运算符。来自 tests/valid/std_string.test.w 的验证assert(hello world hello world); let var initial hey, ; initial you; assert(initial hey, you);多行字符串中的换行与显式\n转义是等价的let s3 hello world; let s4 hello\nworld; assert(s3 s4);1.2length属性String类暴露的唯一属性类型为num表示字符串的长度UTF-16 编码下的字符数量。length: num;assert(hello.length 5); assert(.length 0);示例与边界行为均可在 tests/sdk_tests/std/string.test.w 中验证空字符串长度为0。二、查询类方法contains、startsWith、endsWith、indexOf这组方法用于判断字符串是否包含某个子串或在何处出现返回值均为bool/num。2.1contains(searchString: str): bool检查字符串是否包含指定子串区分大小写。contains(searchString: str): boolassert(hello wing.contains(hello)); assert(!hello wing.contains(Hello)); // 大小写敏感 assert(hello wing.contains(w));2.2startsWith(searchString: str): bool与endsWith(searchString: str): bool分别判断字符串是否以给定子串开头 / 结尾。startsWith(searchString: str): bool endsWith(searchString: str): boolassert(hello wing.startsWith(h)); assert(!hello wing.startsWith(H)); // 大小写敏感 assert(!hello wing.startsWith(w)); assert(boom.endsWith(m)); assert(!boom.endsWith(b));2.3indexOf(searchString: str): num返回searchString在字符串中第一次出现的索引从 0 开始若未找到返回-1。indexOf(searchString: str): numassert(boom.indexOf(m) 3); assert(boom.indexOf(a) -1); // 未找到返回 -1上述四类查询的测试用例见 tests/sdk_tests/std/string.test.w 与 tests/sdk_tests/std/string.test.w。三、提取与切片at、substring3.1at(index: num): str返回指定索引处的单个字符。关键特性支持负索引负数从字符串末尾倒数计数。越界索引超出[0, length)或负索引超出范围会抛出运行时错误index out of bounds。at(index: num): strassert(boom.at(0) b); assert(boom.at(2) o); // 负索引从末尾倒数 assert(boom.at(-1) m); assert(boom.at(-4) b); // 越界抛出异常 // boom.at(4) - Error: index out of bounds // boom.at(-5) - Error: index out of bounds在源码 packages/winglang/sdk/src/std/string.ts 中at通过一条macro编译期展开实现越界检查if ($args$ $self$.length || $args$ $self$.length 0) { throw new Error(index out of bounds) }也就是说越界保护在编译期由宏生成运行时由 JS 层执行。完整测试见 tests/sdk_tests/std/string.test.w。3.2substring(indexStart: num, indexEnd?: num): str截取从indexStart开始、到indexEnd结束不含indexEnd的子串。indexEnd为可选参数省略时截取到字符串末尾。substring(indexStart: num, indexEnd?: num): strassert(hello wing.substring(0, 5) hello); assert(hello wing.substring(5) wing); assert(hello wing.substring(5, 7) wi); // 超出末尾的结束索引会被安全截断到字符串长度 assert(hello wing.substring(0, 100) hello wing);测试见 tests/sdk_tests/std/string.test.w 与 tests/valid/std_string.test.w。四、修改与变换replace、replaceAll、lowercase、uppercase、trim、concat、split这组方法产生新的字符串或数组原始字符串不变——str是不可变类型。4.1replace(searchString: str, replaceString: str): str与replaceAll(searchString: str, replaceString: str): strreplace只替换第一次出现的子串。replaceAll替换所有出现的子串。replace(searchString: str, replaceString: str): str replaceAll(searchString: str, replaceString: str): strassert(foo.replace(o, 0) f0o); // 只替换第一处 assert(foo.replaceAll(o, 0) f00); // 替换全部 assert(hello world.replace(world, wing) hello wing); assert(hello world world.replaceAll(world, wing) hello wing wing); assert(hello world.replace(wing, ☁) hello world); // 未命中则原样返回 assert(hello world world.replaceAll( , -) hello-world-world); assert(.replace(, hello world) hello world); // 空字符串也能匹配replace在源码中通过macro $self$.replace(...$args$)展开为 JS 原生方法replaceAll展开为$self$.replaceAll(...$args$)见 packages/winglang/sdk/src/std/string.ts。完整测试见 tests/sdk_tests/std/string.test.w。4.2lowercase(): str与uppercase(): str分别返回全小写 / 全大写的新字符串。对非字母字符数字、符号无影响。lowercase(): str uppercase(): strassert(BOOM.lowercase() boom); assert(BooM.lowercase() boom); assert(123#.lowercase() 123#); assert(BooM.uppercase() BOOM); assert(boom.uppercase() BOOM); assert(123#.uppercase() 123#);源码中二者分别通过宏展开为 JS 的toLocaleLowerCase()与toLocaleUpperCase()见 packages/winglang/sdk/src/std/string.ts 与 packages/winglang/sdk/src/std/string.ts即遵循本地化规则进行大小写转换。测试见 tests/sdk_tests/std/string.test.w。4.3trim(): str移除字符串首尾的空白字符空格、制表符\t、换行\n等不处理字符串内部的空白。trim(): strassert(hello wing .trim() hello wing); assert(\thello wing\n.trim() hello wing); assert(.trim() ); assert( some string .trim() some string);测试见 tests/sdk_tests/std/string.test.w。4.4concat(strN: str): str将一个或多个字符串拼接在当前字符串之后返回新的字符串。concat(strN: str): strassert(boom.concat(boom) boomboom); assert(some string.concat(s are immutable) some strings are immutable);测试见 tests/sdk_tests/std/string.test.w。4.5split(separator: str): MutArraystr按分隔符将字符串拆分为可变字符串数组MutArraystr。特别地传入空字符串作为分隔符时会按单个字符逐个拆分。split(separator: str): MutArraystrassert(hello;wing.split(;).at(0) hello); assert(hello;wing.split(;).at(1) wing); assert(hello wing.split( ).at(0) hello); // 空分隔符按字符拆分 assert(hello wing.split().length 10); assert(hello wing.split().at(0) h); assert(hello wing.split().at(1) e);测试见 tests/sdk_tests/std/string.test.w。split常与Json.stringify配合输出结构化结果见下文实战示例。五、静态方法fromJson从Json安全转换字符串5.1 签名与语义String类还提供唯一的静态方法用于把Json值安全转换为强类型字符串str.fromJson(json: Json, options?: JsonValidationOptions): strjson必填要转换为字符串的Json值。options可选JsonValidationOptions类型来自 packages/winglang/sdk/src/std/json.ts目前仅包含一个字段字段类型说明unsafebool?设为true时跳过运行时类型校验可能引发运行时错误5.2 为什么需要fromJson动态 JSON 的类型安全在 Wing 中仅当Json字面量在程序中静态可见时才能直接赋值给str变量对于来自外部如http.get()的响应的动态Json直接赋值会编译报错。此时必须使用fromJson()进行带运行时校验的转换。参见 docs/api/05-language-reference.mdlet jsonString Json hello; let myStr str.fromJson(jsonString);5.3 运行时校验与失败行为fromJson的底层实现位于 packages/winglang/sdk/src/std/string.ts它通过JsonSchema构造type: string的 schema 并对输入json执行校验校验不通过时抛出错误。语言参考给出的失败示例str.fromJson(Json 123); // RUNTIME ERROR: unable to parse number 123 as a string.测试 tests/sdk_tests/std/string.test.w 中定义了错误信息常量PARSE_ERROR unable to parse string并断言传入Json 123会抛出包含该文本的异常let PARSE_ERROR unable to parse string; assert(str.fromJson(Json Hello) Hello); // str.fromJson(Json 123); // 抛出 unable to parse stringnum.fromJson、bool.fromJson等其余基础类型同理见 tests/valid/json_static.test.w 中str.fromJson(jsonOfMany.get(b)) hello的用法。5.4 相关的tryFromJson与unsafefromJson校验失败会抛异常若希望以可选值方式处理失败语言参考介绍了配套的tryFromJson()方法返回str?可与??配合提供默认值docs/api/05-language-reference.mdlet s str.tryFromJson(myJson) ?? invalid string;当确信Json值类型正确、希望跳过运行时校验换取性能时可传入unsafe: truestr.fromJson(Json 10, unsafe: true); // 跳过校验自行承担类型风险上述用法在 tests/valid/struct_from_json.test.w 与语言参考的 schema validation 章节中均有体现。六、实战示例完整运行与预期输出官方 by-example 章节 docs/by-example/21-string-functions.md 给出了一个覆盖本文多数 API 的可直接运行的main.w其自动化生成版本位于 tests/doc_examples/valid/21-string-functions.md_example_1/main.wlog(test.contains(es)); log(test.length); log(test.startsWith(te)); log(test.endsWith(st)); log(test.indexOf(e)); let x [a, b]; log(x.join(-)); log(foo.replace(o, 0)); log(foo.replaceAll(o, 0)); log(Json.stringify((a-b-c-d-e.split(-)))); log(TEST.lowercase()); log(test.uppercase());在本地通过 Wing 控制台运行wing it预期输出true 4 true true 1 a-b f0o f00 [a,b,c,d,e] test TEST注意上例中test.indexOf(e)返回1首个e的位置以及split(-)的结果经Json.stringify输出为 JSON 数组形式。七、源码视角macro与 JS 原生方法的映射从 packages/winglang/sdk/src/std/string.ts 可以看到String类的大多数实例方法并非真正实现而是通过 JSDoc 中的macro指令在编译期展开为 JavaScript 原生字符串方法形成一个轻量、无运行时开销的映射层Wing 方法编译期展开为JSat带越界检查的自定义展开见 3.1contains$self$.includes($args$)endsWith$self$.endsWith($args$)indexOf$self$.indexOf($args$)lowercase$self$.toLocaleLowerCase()uppercase$self$.toLocaleUpperCase()replace$self$.replace(...$args$)replaceAll$self$.replaceAll(...$args$)这一点解释了contains与indexOf的大小写敏感行为、indexOf未命中返回-1、replace只替换首处等语义均与 JS 原生String对象保持一致。源码注释同时说明该类的目的是为 Wing 编译器提供str类型的 JSII 子集通常不应被用户直接实例化消费。八、方法速查总表以下为 docs/api/04-standard-library/std/string.md 中定义的完整 API 一览类别名称签名说明属性lengthlength: num字符串长度查询containscontains(searchString: str): bool是否包含子串大小写敏感查询startsWithstartsWith(searchString: str): bool是否以子串开头查询endsWithendsWith(searchString: str): bool是否以子串结尾查询indexOfindexOf(searchString: str): num首次出现索引未找到返回 -1提取atat(index: num): str取指定索引字符支持负索引越界抛错提取substringsubstring(indexStart: num, indexEnd?: num): str截取子串结束索引可选变换replacereplace(searchString: str, replaceString: str): str替换首次出现的子串变换replaceAllreplaceAll(searchString: str, replaceString: str): str替换全部出现的子串变换lowercaselowercase(): str转为小写本地化规则变换uppercaseuppercase(): str转为大写本地化规则变换trimtrim(): str移除首尾空白变换concatconcat(strN: str): str拼接字符串变换splitsplit(separator: str): MutArraystr按分隔符拆分空串按字符拆静态fromJsonstr.fromJson(json: Json, options?: JsonValidationOptions): str从Json安全转换并校验延伸阅读API 参考原文docs/api/04-standard-library/std/string.md实战示例与输出docs/by-example/21-string-functions.md语言参考str类型与字符串字面量、fromJson校验模型docs/api/05-language-reference.md标准库源码实现String类与macropackages/winglang/sdk/src/std/string.ts校验选项定义JsonValidationOptions.unsafepackages/winglang/sdk/src/std/json.tsSDK 测试套件覆盖全部方法与边界行为tests/sdk_tests/std/string.test.w语言级字符串语义测试tests/valid/std_string.test.w赞分享编程语言编译器云原生语言运行时【免费下载链接】wingA programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡项目地址https://gitcode.com/gh_mirrors/wi/wing点击查看免费下载相关推荐rust-by-practice 复合类型实战彻底掌握 Rust 字符串str / str / String的类型体系、转换与 UTF-8 操作rust by practice 复合类型实战彻底掌握 Rust 字符串str / str / String的类型体系、转换与 UTF 8 操作 本指南文档教程示例工程lamdaFIRERPA一个 Python 客户端跑通 Android UI 自动化与一键抓包lamdaFIRERPA一个 Python 客户端跑通 Android UI 自动化与一键抓包 lamda 是面向 Android 的全栈设备控制平台服GUI自动化逆向工程RPAMCP 服务开发工具pybind11 字符串与编码转换完全指南str / bytes / std::string / wchar_t / string_view 全链路解析pybind11 字符串与编码转换完全指南str / bytes / std::string / wchar_t / string_view 全链路解析 在开发工具上一篇AutoMapper 继承映射Mapping Inheritance完整指南配置继承、运行时多态与优先级机制下一篇字符串操作增强插件StringManipulation深度解读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑