2016-09-07 45 views
3

下面的代碼工作良好,打印「5.0」如何使用聯盟「if」語句[水晶]

$x : Float64 
$y : Float64 
$x = 3.0_f64 
$y = 2.0_f64 
puts $x + $y 

現在,我更改代碼以支持「無」。

$x : Float64? 
$y : Float64? 
$x = 3.0_f64 
$y = 2.0_f64 
puts $x + $y if !$x.nil? && !$y.nil? 

但是,此代碼報告以下錯誤消息。

 
no overload matches 'Float64#+' with type (Float64 | Nil) 
Overloads are: 
- Float64#+(other : Int8) 
- Float64#+(other : Int16) 
- Float64#+(other : Int32) 
- Float64#+(other : Int64) 
- Float64#+(other : UInt8) 
- Float64#+(other : UInt16) 
- Float64#+(other : UInt32) 
- Float64#+(other : UInt64) 
- Float64#+(other : Float32) 
- Float64#+(other : Float64) 
- Number#+() 
Couldn't find overloads for these types: 
- Float64#+(Nil) 

    puts $x + $y if !$x.nil? && !$y.nil? 

我想停止方法的調用「#+()」如果$ x或$ y是零 和打印計算結果,如果兩者都Float64。

這種情況的最佳做法是什麼?


在上面的代碼中,我簡化了這個問題的代碼。 在結果中,問題的含義不由自主地改變了。 我想問下面的代碼實際上。

class Xyz 
    property a, b 
    @a : Float64? 
    @b : Float64? 

    def initialize 
    @a = nil 
    @b = nil 
    end 

    def do_calc 
    if [email protected]? && [email protected]? 
     puts @a + @b 
    else 
     puts "We can't calculate because '@a or @b has nil." 
    end 
    end 
end 

x = Xyz.new 
x.a = 3.0_f64 
x.b = 2.0_f64 
x.do_calc 

此代碼報告以下錯誤。

 
instantiating 'Xyz#do_calc()' 

x.do_calc 
    ^~~~~~~ 

in ./a.cr:15: no overload matches 'Float64#+' with type (Float64 | Nil) 
Overloads are: 
- Float64#+(other : Int8) 
- Float64#+(other : Int16) 
- Float64#+(other : Int32) 
- Float64#+(other : Int64) 
- Float64#+(other : UInt8) 
- Float64#+(other : UInt16) 
- Float64#+(other : UInt32) 
- Float64#+(other : UInt64) 
- Float64#+(other : Float32) 
- Float64#+(other : Float64) 
- Number#+() 
Couldn't find overloads for these types: 
- Float64#+(Nil) 

     puts @a + @b 

如何避免此錯誤?

回答

4

請務必閱讀的文檔有關,如果,並檢查零:https://crystal-lang.org/docs/syntax_and_semantics/if_var.htmlhttps://crystal-lang.org/docs/syntax_and_semantics/if_var_nil.html

這僅適用於局部變量,所以你需要的值先分配給本地變量。

作爲一個附註,全局變量在Crystal 0.19.0中不再存在。

+0

謝謝你的問題。我簡化了這個問題的代碼。 在結果中,問題的含義被不自覺地改變了.. 我添加了我想要問的問題.. – elgoog

+0

我在你指定的鏈接中找到了答案。對不起,重複的問題。 – elgoog