2013-05-01 2 views
0

У меня есть то, что я думаю, было бы довольно простой частью кода. Тем не менее, «еще» Следующий код не мое точно, но она иллюстрирует структурирование блоков:Ruby Else никогда не достигают заявления IF ELSE

adHoc = true 

if blah... 
    adHoc = false 
end 

if blah... 

    if adHoc 
     my_logger.info("REACHED WHENEVER ADHOC IS TRUE") 
    else 
     my_logger.info("NEVER REACHED") 
    end 

end 

Как вышло, что части иначе не достигается?

спасибо.

+8

Поскольку 'blah' всегда false, когда' adHoc' является ложным? –

+0

что в первом бла ...? adHoc = false, вероятно, никогда не вызывается. – davidrac

+0

Что именно вы видите в своем журнале? Почему вы решили, что еще ничего не достигнуто? Видели ли вы, ОБРАТИТЕСЬ, КОГДА АДХОК ИСТИННО? – lifus

ответ

2

трассировки через возможности, есть только 4 случая:

  1. бла ... истинна на обоих вызовов.
  2. бла ... ложна как называет
  3. бла ... правда на первом и ложна на втором
  4. бла ... ложен на первом и правда на второй.

Сценарий 1.

бла это правда. adhoc установлен в false. NEVER REACHED записывается в журнал.

Сценарий 2.

бла является ложным, ADHOC установлен в истинной. Здесь ничего не регистрируется.

Сценарий 3.

бла это правда, ADHOC установлен в ложной. Ничего не регистрируется, потому что 2-й блаш является ложным.

Сценарий 4.

бла является ложным, ADHOC установлен в истинной.
Второй вызов blah является истинным, и «REACHED WHENEVER ADHOC IS TRUE» зарегистрирован.


Как вы можете видеть, единственный способ для «REACHED WHENEVER ADHOC ПРАВДА», которое будет отображаться в сценарии 4, где бла ... меняется от ложного к истинному между вызовами.


Возможностью бла ... для сценариев 3 или 4:

ObjectSpace.count_objects [: T_NODE] .odd?