我想聲明一個浮點型變量,我將稍後進行一些計算。但是,解釋器推斷變量是Array
,並且在我嘗試將該變量用作浮點時稍後會產生錯誤。Ruby異常類型推斷
avg = 0.0, nr = 0
p "avg is #{avg.class} "
輸出如下:
"avg is Array "
我想聲明一個浮點型變量,我將稍後進行一些計算。但是,解釋器推斷變量是Array
,並且在我嘗試將該變量用作浮點時稍後會產生錯誤。Ruby異常類型推斷
avg = 0.0, nr = 0
p "avg is #{avg.class} "
輸出如下:
"avg is Array "
你不能聲明變量的方式。
avg = 0.0
nr = 0
試試這個:
avg, nr = 0.0, 0
您的代碼不會做你認爲它,它很容易地看到:
> a=2, b=3
=> [2, 3]
> b
=> 3
> a
=> [2, 3]
使用單獨的報表變量或使用下表:
avg, nr = 0.0, 0
用分號或換行符替換逗號。 Ruby中的逗號並不像你期望的那樣。
什麼你實際上是書面方式在這裏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
並將其插入到數組中。
這裏沒有涉及類型推斷(或者在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
用分號';'分隔語句,而不是逗號'',這是數組分隔符。 – Tensibai