2013-04-04 2 views
2

Можете ли вы объяснить, какое выражение использует ruby ​​в «elsif», если выражение пустое? Выходпустое состояние в разделе elsif

arg = 3 
if (arg == 1) 
    puts "1" 
elsif (arg == 2) 
    puts "2" 
elsif 
    puts "3" 
end 

p (1...10).map { |i| 
    if (i == 1) 
    1 
    elsif (i == 2) 
    2 
    elsif 
    3 
    end 
} 

Сценарий:

3 
[1, 2, nil, nil, nil, nil, nil, nil, nil] 

ответ

4

В принципе есть больше, чтобы сказать:

В 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 
+0

Интересно, причина, по которой второй пример OP возвращает ниль для всех других случаев, заключается в том, что ее обработка 3, как условное, входит в пустой блок. Принимая во внимание, что оператор печати в первом выполняется как условное печатание значения, но все равно возвращает nil – Mgrandjean

+1

@Mgrandjean да, вы правы. –

+0

Спасибо, мне очень помогли. –

0

Предполагая, что вы имеете в виду вы хотите знать, если элемент, который вы «повторно итерация пустая, а что просто проваливается за то, что не совпавшие предыдущие оценки:

elsif i.blank? 

Если вы хотите поймать-все, а затем просто использовать:

else 
2

Если в одной строке нет выражения, в качестве условия используется выражение из следующей строки. У вас не может быть пустого выражения.

Вашего первый пример эквивалентен следующему:

arg = 3 
if (arg == 1) 
    puts "1" 
elsif (arg == 2) 
    puts "2" 
elsif puts "3" # puts is the condition 
    #empty 
end 

Ни первое или второе условие, и так как puts returns nil ни один не последний. Однако puts распечатывает свои аргументы перед возвратом nil, поэтому вы все равно видите 3 на выходе.

Аналогично, ваш второй пример эквивалентен:

p (1...10).map { |i| 
    if (i == 1) 
    1 
    elsif (i == 2) 
    2 
    elsif 3 
    nil #nil is the default if no result is specified 
    end 
} 

Поскольку в Ruby, все, что не false или nil оценивающего, как true в условном, последний elsif всегда истинен (3 не false или nil) и эффективно действует как обычная else. Также возвращается значение по умолчанию nil, если ничего не указано, поэтому вы видите nil s в своем результате.

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