В принципе есть больше, чтобы сказать:
В if-else
ветвление, когда какое-либо условие совпадение было найдено, то последнее утверждение согласованного пункта было возвращено по блоку if-else
. рассмотрим ниже:
arg = 4
p m = if (arg == 1)
"1"
elsif (arg == 3)
"3"
elsif (arg ==4)
"5";"11"
elsif
"3"
end
выход:
#11
Но в соответствие с каждым пунктом, если какой-либо голый elsif
найден, то проверки if-else
блока значение истинности его непосредственного выражения и возвращал значение соответственно:
arg = "4"
p m = if (arg == "1")
47
elsif
10 ; "7"
elsif (arg =="5")
12;14
elsif
2
end
вывода utput:
#"7"
Ниже код будет возвращать nil
как ничего, чтобы вернуться в 10
используется как проверка состояния, после этого ничего в коде. так что nil
был возвращен.
arg = "4"
p m = if (arg == "1")
47
elsif
10
elsif (arg =="5")
12;14
elsif
2
end #nil
другой код ниже, чтобы сделать вещи окончательно ясно:
arg = "4"
p m = if (arg == "1")
47
elsif
nil
elsif (arg =="5")
12;14
elsif
2 ; "44"
end #44
Со всеми примерами сказал выше, я надеюсь, что причина ясна, почему - приведенный ниже код выхода: [1, 2, nil, nil, nil, nil, nil, nil, nil]
p (1...10).map { |i|
if (i == 1)
1
elsif (i == 2)
2
elsif
3
end
}
Чтобы ответить на ваш первый код, сначала взгляните на следующие два:
m = if puts "hi"
p "hello"
end #"hi"
«привет» печатается как puts
возвращается nil
, на котором if
пункт оцененных в false
таким образом hello
не печатается. Но нижеприведенный код используется как p
, и if
оговорка получена на возвращаемом p
значении true
.
m = if p "hi"
p "hello"
end
#"hi"
#"hello"
Теперь надеюсь, вы поняли, почему 3
приходит в качестве выхода из кода ниже, из сказанного выше всякой логики применяется в целом:
arg = 3
if (arg == 1)
puts "1"
elsif (arg == 2)
puts "2"
elsif
puts "3"
end
Интересно, причина, по которой второй пример OP возвращает ниль для всех других случаев, заключается в том, что ее обработка 3, как условное, входит в пустой блок. Принимая во внимание, что оператор печати в первом выполняется как условное печатание значения, но все равно возвращает nil – Mgrandjean
@Mgrandjean да, вы правы. –
Спасибо, мне очень помогли. –