我正在制作一个大小为n个随机数的数组的函数,但我对while的比较会引发错误。
>>> x
array([(1, [1.0, 2.0, 3.0]), (2, [4.0, 5.0, 6.0]), (3, [7.0, 8.0, 9.0])],
dtype=[('id', '<i8'), ('arr', '<f8', (3,))])
抱怨:预期while ar.len() as i32 < size { }
,!
,(
,+
,,
,::
或{{1}之一},找到<
。
如果我删除>
抱怨{
,如果我向size变量添加as i32
,那么它就不会抱怨。
答案 0 :(得分:8)
当您从较小尺寸类型投射到较大尺寸类型时,您不会丢失任何数据,但数据现在会占用更多空间。
当您从较大的类型转换为较小的类型时,可能会丢失一些数据,但数据占用的空间会减少。
假设我有一个大小 1 的方框,可以容纳数字0到9,另一个大小 2 的方框可以容纳数字0到99。
如果我想存储数字7;两个盒子都可以使用,但如果我使用较大的盒子,我将留下空间。我可以毫不费力地将值从较小的盒子移动到较大的盒子。
如果我想存储号码42;只有一个盒子可以容纳这个数字:较大的一个。如果我尝试取数字并将其塞入较小的盒子中,则会丢失一些东西,通常是数字的上半部分。在这种情况下,我的42将变成 2 !糟糕!
此外,签名和无签名扮演一个角色。在带符号的二进制数中,最高位表示数字的符号。当您在有符号和无符号数字之间进行转换时,可能会错误地解释该值!这可能意味着像42这样的数字变成-48!
在这个特定的案例中,它有点复杂。 usize
被定义为&#34;指针大小的整数&#34;,通常是机器的原始大小。在64位x64处理器上,这意味着usize
是64位,而在32位x86处理器上,它将是32位。
将usize
投射到i32
因此会根据您运行的机器类型而有所不同。
您得到的错误消息是因为您尝试的代码在语法上不正确,并且编译器没有提供良好的错误消息。
你真的想输入
while (ar.len() as i32) < size { }
括号将帮助正确应用优先级。
为了安全起见,我会投出更大的价值:
while ar.len() < size as usize { }
答案 1 :(得分:3)
您的size
似乎是i32
类型。你要么需要括号:
while (ar.len() as i32) < size { }
或将size
投射到usize
:
while ar.len() < size as usize { }
当len()
返回usize
时,比较两边的类型都需要匹配。您需要在第一种情况下使用括号,以便<
运算符不会尝试将i32
与size
进行比较,而是将ar.len() as i32
与size
进行比较,这是您的意图。