2016-09-07 4 views
3

После кода работает хорошо и печати «5.0»Как использовать объединение в «если» заявление [Кристалл]

$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? 

Я хотел бы, чтобы остановить вызов метода «# +()», если $ х или $ у равна нулю и распечатать вычисленный результат, если оба 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.html и https://crystal-lang.org/docs/syntax_and_semantics/if_var_nil.html

Это относится только к локальным переменным, так что вам нужно присвоить значения локальных переменных первого.

В качестве побочного примечания глобальные переменные больше не существуют на языке с Crystal 0.19.0.

+0

Спасибо за ваш вопрос. Я упростил код для этого вопроса. В результате значение вопроса было изменено непроизвольно .. Я добавил вопрос, который я хотел задать на самом деле. – elgoog

+0

Я нашел ответ в указанной вами ссылке. Извините за дублированный вопрос. – elgoog

Смежные вопросы