2014-11-03 3 views
0

У меня есть следующий класс и хотите шаги, чтобы вернуть false, когда он прибывает в step_two:Возврат ложно вызова метода

class Something 

    def steps 
    step_one 
    step_two 
    step_three 
    end 

    private 

    def step_one 
     some_function 
    end 

    def step_two 
     if some_other_function 
     return false 
     end 
     true 
    end 

    def step_three 
     some_function 
    end 

end 

Как это написано, метод steps не остановит выполнение на step_two и будет продолжаться до step_three. Я могу написать его таким образом, чтобы сделать его работу:

def steps 
    step_one 
    return false unless step_two 
    step_three 
end 

Или, если все три шага может вернуться ложным:

def steps 
    return false unless step_one 
    return false unless step_two 
    return false unless step_three 
end 

Есть ли лучший способ сделать это? Наверное, я спрашиваю, может ли метод вызова в Ruby вернуть false, если вызываемый метод возвращает false?

+1

После повторного чтения сообщения я не уверен, если я понимаю вопрос. Вы сказали, что хотите, чтобы метод шагов возвращал false, когда он попадает в step_two *. Что вы подразумеваете под «хитами»? –

+1

-1 потому что вы видели вопрос @ Павла и не отвечали на него. Измените первое предложение, чтобы заменить «хиты» тем, что объясняет, чего вы хотите достичь. –

+0

Жестокий. Угадайте, что парень не может обедать. По хитам я имею в виду «прибывает». После завершения step_one. Он «прибывает» на второй шаг.Я также изменил это, если это не имеет смысла. Это была опечатка. –

ответ

1

Поскольку ваш метод step_two возвращает false, проблема заключается в том, что ваш оператор if принимает значение false и с радостью переходит к step_three. У вас есть несколько вариантов:

Используйте оператор unless вместо if, например, так:

def steps 
    step_one 
    return false unless step_two 
    step_three 
end 

или вы можете использовать ! (не) оператор:

def steps 
    step_one 
    return false if !step_two 
    step_three 
end 

Update

Из уточнения в комментариях, вы хотите, чтобы ваш step метод возвращает false, если какой-либо другой метод вызывает return false или true, если все возвращается true. Практически говоря, что-то вроде этого:

def steps 
    step_one && step_two && step_three 
end 

В этом случае, если какой-либо из методов возврата ложным, потому что мы используем && (а) операторы, все это не удается, и вы получите ложное значение. Например, если step_one возвращает true, а step_two возвращает false, step_three никогда не запускается, а значение всей операции разрешено равным false.

+0

У меня было, если бы оно было, если только вы не сказали. Сделал изменение выше. –

0

А что?

def steps 
    step_one 
    if step_two 
     step_three 
    end 
end 

Это вам лучше?

+1

'if' нуждается в' end'. –

+0

Мне это не кажется намного лучше. Если бы мне хотелось, чтобы метод шагов возвращал false для любого из трех, это было бы довольно сложно. –

2

Вы можете цепной метод вызова и условно выполнить дальнейшие шаги, только если предыдущее возвращение верно, как это:

def steps 
    step_one and step_two and step_three 
end 

Таким образом, steps метод также возвращает истину или ложь в зависимости от общего выполнения каждого шага - т.е. true будет означать, что все этапы были успешно выполнены.

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