Ruby异常类型推理

Ruby异常类型推理,ruby,Ruby,我想声明一个浮点变量,稍后我将使用它进行一些计算。但是,解释程序推断该变量是一个数组,当我尝试将该变量用作浮点时,会产生一个错误 avg = 0.0, nr = 0 p "avg is #{avg.class} " 产出如下: "avg is Array " 请尝试以下方法: avg, nr = 0.0, 0 不能那样声明变量 avg = 0.0 nr = 0 您的代码并不像您认为的那样,而且很容易看到: > a=2, b=3 => [2, 3] > b =>

我想声明一个浮点变量,稍后我将使用它进行一些计算。但是,解释程序推断该变量是一个
数组
,当我尝试将该变量用作浮点时,会产生一个错误

avg = 0.0, nr = 0
p "avg is #{avg.class} "
产出如下:

"avg is Array "
请尝试以下方法:

avg, nr = 0.0, 0

不能那样声明变量

avg = 0.0 
nr = 0

您的代码并不像您认为的那样,而且很容易看到:

> a=2, b=3
=> [2, 3]
> b
=> 3
> a
=> [2, 3]
对变量使用单独的语句或使用以下形式:

avg, nr = 0.0, 0

用分号或换行符替换逗号。Ruby中的逗号的行为与您希望的不同。

您在Ruby中实际写的是:

avg=(0.0,nr=0)
avg, nr = 0.0, 0
Ruby将0.0作为第一个值,并进行赋值:

nr=0
它返回指定的值:

irb(main):003:0> avg = 0.0, nr = 0
=> [0.0, 0]

irb(main):005:0> nr = 0
=> 0

并将其插入数组。

这里不涉及类型推断(或者在Ruby中,一般来说),问题是Ruby如何解析表达式
avg=0.0,nr=0
被解释为
avg=(0.0,(nr=0))
而不是
(avg=0.0),(nr=0)
。因此
avg
被分配数组
[0.0,0]
,因为
nr
被分配整数
0
。除了赋值给
nr
,它等价于表达式
avg=0.0,0

avg = 0.0, nr = 0
p avt # => [0.0, 0]
p nr  # => 0

avg = 0.0, 0
p avg # => [0.0, 0]
在Ruby中执行测试的正确方法是:

avg=(0.0,nr=0)
avg, nr = 0.0, 0
或者只使用两种不同的赋值表达式:

avg = 0.0
nr = 0

用分号分隔语句
不是逗号
,它是数组分隔符。