if
Конструкция if вычисляет заданную ветвь, если её условие является истинным. В противном случае вычисляется ветвь else, если она присутствует.
a = 1
if a > 0
a = 10
end
a # => 10
b = 1
if b > 2
b = 10
else
b = 20
end
b # => 20
Чтобы записать цепочку if-else-if, используйте elsif:
if some_condition
do_something
elsif some_other_condition
do_something_else
else
do_that
end
После конструкции if тип переменной зависит от типов выражений, используемых в обеих ветвях.
a = 1
if some_condition
a = "hello"
else
a = true
end
# a : String | Bool
b = 1
if some_condition
b = "hello"
end
# b : Int32 | String
if some_condition
c = 1
else
c = "hello"
end
# c : Int32 | String
if some_condition
d = 1
end
# d : Int32 | Nil
Обратите внимание: если переменная объявлена в одной из ветвей, но не в другой, то в конце конструкции if она также будет иметь тип Nil.
Внутри ветви конструкции if тип переменной определяется присвоенным ей в этой ветви значением или значением, которое она имела до ветви, если ей не присваивалось новое значение:
a = 1
if some_condition
a = "hello"
# a : String
a.size
end
# a : String | Int32
Иными словами, тип переменной определяется типом последнего выражения или последних выражений, присвоенных ей.
Если выполнение одной из ветвей не доходит до конца конструкции if, как в случае с return, next, break или raise, этот тип не учитывается в конце конструкции if:
if some_condition
e = 1
else
e = "hello"
# e : String
return
end
# e : Int32
To the extent possible under law, the persons who contributed to this workhave waived
all copyright and related or neighboring rights to this workby associating CC0 with it.
https://crystal-lang.org/reference/1.2/syntax_and_semantics/if.html