Ruby异常类型推断

时间:2015-05-07 15:16:57

标签: ruby

我想声明一个浮点变量,稍后我会做一些计算。但是,解释器推断变量是Array,并且当我尝试将变量用作浮点数时稍后会产生错误。

avg = 0.0, nr = 0
p "avg is #{avg.class} "

输出以下内容:

"avg is Array "

6 个答案:

答案 0 :(得分:4)

您的代码没有按照您的想法执行,而且很容易看到:

> a=2, b=3
=> [2, 3]
> b
=> 3
> a
=> [2, 3]

对变量使用单独的语句或使用以下格式:

avg, nr = 0.0, 0

答案 1 :(得分:3)

你不能那样声明变量。

avg = 0.0 
nr = 0

答案 2 :(得分:2)

请改为尝试:

avg, nr = 0.0, 0

答案 3 :(得分:2)

你在Ruby中实际写的是:

avg=(0.0,nr=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

并将其插入数组中。

答案 4 :(得分:2)

这里没有涉及类型推断(或者通常在Ruby中),问题是Ruby如何解析你的表达式。您可能会将{ "Name":"Bob", "Pets":[ {"Type":"Cat", "Nam 解释为avg = 0.0, nr = 0而不是avg = (0.0, (nr = 0))。因此,为(avg = 0.0), (nr = 0)分配了avg,因为implicit array assignment[0.0, 0]被分配了整数nr。除了0的分配外,它与表达式nr

相同
avg = 0.0, 0

在Ruby中执行multiple assignment的正确方法是:

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

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

或者只使用两个不同的赋值表达式:

avg, nr = 0.0, 0

答案 5 :(得分:1)

用分号或换行符替换逗号。 Ruby中的逗号不会像你希望的那样表现。