DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sjw166
今日帖子: 20
在线用户: 9
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2020/9/29 0:12:53
标题:
TArray<T>可以这样初始化,学到了 浏览:2961
加入我的收藏
楼主: var
  LArr: TArray<Integer>;
begin
  LArr := TArray<Integer>.Create(1,2,3,4,5,6,7);
end;
----------------------------------------------
-
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2020/9/29 9:09:58
1楼: 还可以这样:LArr =[1,2,3,4,5,6,7]
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 ksrsoft (cb168) ★☆☆☆☆ -
普通会员
2020/9/29 9:40:17
2楼: 学习
----------------------------------------------
-
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2020/9/29 10:19:44
3楼: 还可以这样:LArr =<1,2,3,4,5,6,7]

:)  我瞎掰的
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2020/9/29 10:28:26
4楼: http://www.raysoftware.cn/?p=278
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2020/9/29 11:20:37
5楼: LArr := [1,2,3,4,5,6,7] 这个是有用过;
武大侠的TArryEx<T>早就收藏了;

TArray<T>.Create();昨晚在Dephi自带的源码中偶然看到的,感觉奇怪能Create(),真楞了一会,难道只是一个语法糖,还是真是一个类?
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2020/9/29 13:51:57
6楼: 没必要调用Create,因为下面两行编译器生成的机器码是一模一样的。多了个Create不直观而且还麻烦。
var
  LArr: TArray<Integer>;
begin
  LArr := TArray<Integer>.Create(1,2,3,4,5,6,7);
  LArr := [1,2,3,4,5,6,7];
end;

实际上是语法糖,这块代码是编译器就地展开的,相当于自动调用SetLength 7,然后生成7行代码一个一个元素赋值。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 w_ou (merced) ★☆☆☆☆ -
普通会员
2020/9/29 14:41:18
7楼: 但是在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 ...;
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2020/9/29 21:47:39
8楼: @w_ou (merced)
实际上是一样的

  var k := ['123','2'];
  for var I in ['123','2'] do
  begin

  end;

编译后的代码都是生成一个2维的动态数组,然后一个一个赋值,之后操作的。估计是从泛型数组之后改成对动态数组的操作的,否则这个in有二义性。
此帖子包含附件:
PNG 图像
大小:465.7K
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2020/9/29 23:01:58
9楼: 谢谢大侠们分析解惑了,明白了。
Embarcadero的文档缺课太多太多了.....
----------------------------------------------
-
作者:
男 w_ou (merced) ★☆☆☆☆ -
普通会员
2020/9/30 3:21:41
10楼: 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的位置
此帖子包含附件:
PNG 图像
大小:107.4K
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2020/9/30 15:09:19
11楼: 不过还是有个技巧能让它以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
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2020/10/14 13:22:15
12楼: Create 方式初始化数组,可以在使用内联变量的时候省去声明类型
比如:
  var Arr := TArray<Integer>.Create(1, 2, 3, 4, 5, 6, 7);
  TArray.Sort<TArray<Integer>>(Arr);

如果这样声明,就无法进行泛型排序。
  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
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2020/10/14 15:19:47
13楼: @earthsbest
对的
  var Arr1 := [1, 2, 3, 4, 5, 6, 7];
  var Arr2 :TArray<Integer> := [1, 2, 3, 4, 5, 6, 7];
Arr1的类型是array of Integer
Arr2的类型是TArray<Integer>
所以你要能用TArray排序就要显式指定类型
Arr2可以TArray.Sort的
我觉得主要还是Delphi从泛型以后有了两套动态数组方案,语义上出现了歧义,[1, 2, 3, 4, 5, 6, 7]这种最终选择了旧的动态数组。
语法上其实可以把旧的动态数组砍了,甩掉包袱轻装前进。
旧的动态数组有不少不方便的地方,比如在两个地方定义的array of Integer类型就是不兼容的,不如TArray<Integer>在几个地方定义都是兼容的
----------------------------------------------
武稀松http://www.raysoftware.cn
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行140.625毫秒 RSS