但是在for var v in ... do语句中,in后面以方括号开头将被认为是集合类型,所以里边的元素只能是0..255的数值型或枚举型,并且循环时会按元素取值的升序而不是下标顺序。浮点、字符串、对象等类型的元素则根本不允许。 这种情况下就只能写TArray<T>.Create了: for var v in TArray<Integer>.Create(3000, 1000, 2000) do ...; for var v in TArray<string>.Create('abc', 'def', 'xyz') do ...;
----------------------------------------------
-
to wr960204: 看来是10.4里改进的语法。10.3.3里写for var I in ['123','2'] do会报编译错误。 选一个两个版本都能接受的0..255间的整数数组的for in语句来测试: for var I in [5, 1, 3] do ; 10.4确实是与你类似的反汇编的结果,而10.3.3反汇编的结果见附件。可以看到10.3.3把[5, 1, 3]当作集合类型了,该集合存放在$005fd1a8的位置
不过还是有个技巧能让它以set的类型运行的,就是加上范围 for var I in [5, 1..1, 3] do 编译后就是以集合的方式遍历集合元素。 但是实际上不建议这样做。 集合效率虽然高,但是数量受限,子元素类型必须是有序类型。 另外这个地方用集合还有个二义性,集合的遍历是按照序号的由小到大遍历的,所以I的值会是1,3,5这三个值。 而编译成动态数组,三个值就是你指定的顺序。
另外kotlin,swift,go我感觉语法越来越像Delphi。 像kotlin增加了子界类型,可以if (i in 1..2)这样的语法。先不说var i:String这样的语法。可以给已有的类扩展方法和Delphi的Helper功能也都是一样的。
----------------------------------------------
武稀松http://www.raysoftware.cn
如果这样声明,就无法进行泛型排序。 var Arr := [1, 2, 3, 4, 5, 6, 7]; // There is no overloaded version of 'TArray.Sort<System.TArray<System.Integer>>' // that can be called with these arguments TArray.Sort<TArray<Integer>>(Arr);
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw