2015-05-07 80 views
2

我想聲明一個浮點型變量,我將稍後進行一些計算。但是,解釋器推斷變量是Array,並且在我嘗試將該變量用作浮點時稍後會產生錯誤。Ruby異常類型推斷

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

輸出如下:

"avg is Array " 
+0

用分號';'分隔語句,而不是逗號'',這是數組分隔符。 – Tensibai

回答

3

你不能聲明變量的方式。

avg = 0.0 
nr = 0 
2

試試這個:

avg, nr = 0.0, 0 
4

您的代碼不會做你認爲它,它很容易地看到:

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

使用單獨的報表變量或使用下表:

avg, nr = 0.0, 0 
1

用分號或換行符替換逗號。 Ruby中的逗號並不像你期望的那樣。

2

什麼你實際上是書面方式在這裏Ruby是:

avg=(0.0,nr=0) 

紅寶石以0.0作爲第一個值,並做了分配:

nr=0 

它返回指定值:

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

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

並將其插入到數組中。

2

這裏沒有涉及類型推斷(或者在Ruby中),問題在於Ruby如何解析表達式。如您所料,avg = 0.0, nr = 0被解釋爲avg = (0.0, (nr = 0))而不是(avg = 0.0), (nr = 0)。因此avg被指定爲數組[0.0, 0],因爲implicit array assignment,而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中multiple assignment是:

avg, nr = 0.0, 0 

或者只是使用兩種不同的賦值表達式:

avg = 0.0 
nr = 0