array of const

本文探讨了在Delphi中使用PChar时常见的错误实践,包括不当存储局部变量及返回值的问题。此外,还深入解析了format函数的工作原理及其变体开放数组参数的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. {A common error when working with PChars is to store a local variable in a data structure, or return it as a value. When your routine ends, the PChar disappears because it is a pointer to memory, and not a reference counted copy of the string. For example:}
  2. function title(n: Integer): PChar;
  3. var
  4.   s: string;
  5. begin
  6.   s := Format('title - %d', [n]);
  7.   Result := PChar(s); // DON'T DO THIS
  8. end;
  9. {This example returns a pointer to string data that is freed when the title function returns.}
  10. procedure TForm1.MyDataAfterDelete(DataSet: TDataSet);
  11. begin
  12.   StatusBar1.SimpleText := Format('There are now %d records in the table', [DataSet.RecordCount]);
  13. end;

format 函数的原型是 function Format(const Format: string; const Args: array of const): string; overload;

第二个参数的类型是array of const,不知道是什么类型,搜了下:

 

变体开放数组参数  
     
   
  变体开发数组参数允许向单个过程或函数传递不同类型表达式的数组。要定义含有变体开放数组参数的例程,需要指定array   of   const作为参数类型。如,  
   
  procedure   DoSomething(A:   array   of   const);  
   
  这里声明了一个叫做DoSomething的过程,该过程可以操作不同种类的数组。  
   
  array   of   const结构等价于array   of   TVarRec。TVarRec,在单元System中声明,用于表示一个记录,记录中有一个可以保存多种值(整数、布尔、字符、实数、串、指针、类、类引用、接口、变体等)的变体部分。TVarRec中的VType字段表示数组中每个元素的类型。一些类型作为指针传递而不传递值;特别是长串,作为指针传递并且必需转换为string类型。  
   
  下面的例子在函数中使用了变体开放数组参数,该函数对接受的每个元素创建一个串表示法,最后连接成一个串。该函数中调用的串处理例程都定义在SysUtils单元中。  
   
  function   MakeStr(const   Args:   array   of   const):   string;  
   
  const  
   
      BoolChars:   array[Boolean]   of   Char   =   ('F',   'T');  
   
  var  
   
      I:   Integer;  
   
  begin  
   
      Result   :=   '';  
   
      for   I   :=   0   to   High(Args)   do  
   
          with   Args[I]   do  
   
              case   VType   of  
   
                  vtInteger:         Result   :=   Result   +   IntToStr(VInteger);  
   
                  vtBoolean:         Result   :=   Result   +   BoolChars[VBoolean];  
   
                  vtChar:               Result   :=   Result   +   VChar;  
   
                  vtExtended:       Result   :=   Result   +   FloatToStr(VExtended^);  
   
                  vtString:           Result   :=   Result   +   VString^;  
   
                  vtPChar:             Result   :=   Result   +   VPChar;  
   
                  vtObject:           Result   :=   Result   +   VObject.ClassName;  
   
                  vtClass:             Result   :=   Result   +   VClass.ClassName;  
   
                  vtAnsiString:   Result   :=   Result   +   string(VAnsiString);  
   
                  vtCurrency:       Result   :=   Result   +   CurrToStr(VCurrency^);  
   
                  vtVariant:         Result   :=   Result   +   string(VVariant^);  
   
                  vtInt64:             Result   :=   Result   +   IntToStr(VInt64^);  
   
          end;  
   
  end;  
   
  可以用一个开放数组构造器(见开放数组构造器)来调用该函数。例如:  
   
  MakeStr(['test',   100,   '   ',   True,   3.14159,   TForm])  
   
  上面的调用将返回串   “test100   T3.14159TForm"。  

也就是说[]符号就可以将任何可以format类型的变量括起来直接在format中使用了。

### 关于 `Array.of` 的用法及其创建数组中特殊字符的处理 #### 1. **`Array.of` 的基本功能** `Array.of` 是一种用于创建数组的方法,它能够接收任意数量的参数并将这些参数转化为数组元素。这种方法相较于传统的字面量语法(如 `[...]`),更加灵活,尤其适用于动态参数列表的场景[^3]。 ```javascript const array = Array.of(1, 2, 3); console.log(array); // 输出 [1, 2, 3] ``` 此方法的一个显著特点是即使只有一个参数传入,也不会像 `new Array(size)` 那样将其视为长度设置,而是直接作为数组的第一个元素。 ```javascript const singleElementArray = Array.of(5); console.log(singleElementArray); // 输出 [5] const sizeBasedArray = new Array(5); console.log(sizeBasedArray); // 输出 [], 数组长度为5但无实际元素 ``` --- #### 2. **处理 `Array.of` 创建数组中的反斜杠** 当使用 `Array.of` 创建数组时,如果其中包含字符串形式的反斜杠或其他特殊字符,通常需要对其进行预处理后再构建数组。以下是几种常见的解决方案: ##### (1) **使用正则表达式替换反斜杠** 对于单个字符串或一组字符串,可以借助正则表达式将所有的反斜杠移除再传递给 `Array.of`。 ```javascript // 单一字符串示例 let strWithBackslash = "\\example\\string\\"; strWithBackslash = strWithBackslash.replace(/\\/g, ""); // 替换所有反斜杠 let resultArray = Array.of(strWithBackslash); console.log(resultArray); // 输出 ["examplestring"] // 多个字符串示例 let stringsWithBackslashes = ["\\first\\", "\\second\\"]; stringsWithBackslashes = stringsWithBackslashes.map(s => s.replace(/\\/g, "")); resultArray = Array.of(...stringsWithBackslashes); console.log(resultArray); // 输出 ["first", "second"] ``` 这里的关键是通过 `.replace(/\\/g, "")` 来全局匹配并删除字符串中的反斜杠[^1]。 --- ##### (2) **自定义过滤器移除特殊字符** 除了简单的反斜杠外,可能还需要针对更多种类的特殊字符进行清理。此时可设计一个通用的过滤机制,类似于 PHP 中 `$ArrFilters` 的概念[^2]。 ```javascript function removeSpecialChars(inputString, filterList) { let filteredString = inputString; for (let char of filterList) { const regex = new RegExp(char, "g"); filteredString = filteredString.replace(regex, ""); } return filteredString; } // 定义要过滤的字符集(ASCII 或 Unicode) const specialCharFilter = ["\\\\"]; // ASCII 转义序列表示反斜杠 // 测试数据 let rawString = "\\test\\with\\special\\chars\\"; rawString = removeSpecialChars(rawString, specialCharFilter); let finalArray = Array.of(rawString); console.log(finalArray); // 输出 ["testwithspecialchars"] ``` 在这个例子中,`removeSpecialChars` 函数允许用户指定一系列待移除的字符,并基于它们生成对应的正则表达式执行批量替换操作。 --- #### 3. **解决 JSON 解析过程中的转义问题** 有时,`Array.of` 接收的内容来源于外部输入(例如来自用户的 JSON 字符串)。这种情况下,原始数据可能存在额外的转义符号影响解析效果。对此需注意两点: - 在解码前先清除不必要的转义; - 利用内置工具如 `JSON.parse()` 正确解释合法的 JSON 文本。 ```javascript let jsonString = '{"key":"value","escaped":"\\content"}'; try { jsonString = jsonString.replace(/\\\\/g, "\\"); // 先初步简化双重转义 let parsedObject = JSON.parse(jsonString); // 提取值放入数组 let valuesAsArray = Array.of(parsedObject.key, parsedObject.escaped); console.log(valuesAsArray); // 输出 ["value", "content"] } catch (error) { console.error("Invalid JSON format:", error.message); } ``` 上述代码片段展示了如何在面对嵌套层次较深或者存在多重转义标记的数据时保持稳健性[^1]。 --- ### 总结 无论是单独处理还是批量清洗,都可以依靠现代 JavaScript 提供的强大字符串操纵能力来应对各种复杂的字符需求。结合 `Array.of` 的灵活性特点,开发者能够在不同业务场景下轻松构造满足条件的目标集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值