2015-07-06 4 views
6

Я знаю, что Руби поддерживает суффикс if как:Какова цель использования суффикса «if» в Ruby?

number = -42 if opposite 

но какова цель этого? Почему он будет использоваться вместо инструкции if?

+0

Я думаю, что эта форма «умного» назначения уродлива, но в других случаях это делает: 'raise some_exception if something_bad'. – user2864740

+0

Ruby имеет это, потому что Perl имеет это, Perl имеет это, потому что (AFAIK) иногда он читает лучше. –

+2

@ user2864740, я полностью согласен с вами. Я вспоминаю прочтение строки: «Все хорошо, если все кончается хорошо», и думая, насколько лучше это было бы «Если все кончается хорошо, все хорошо». –

ответ

1

Это то же самое, что и префикс, но короче. Единственная причина - сохранить вертикальное пространство в текстовом редакторе.

3

Это может сделать код более удобным для чтения в некоторых случаях. Я считаю, что это особенно верно в случае unless, где у вас есть какие-то действия вы обычно необходимо выполнить:

number = -42 unless some_unusual_circumstance_holds 

После того как вы его unless, для симметрии, имеет смысл поддерживать его if также.

+0

Не понимаю, почему вы упоминаете «если» только косвенно Если у вас есть 'если' для вещей, которые вы обычно хотите поддержать, то у вас есть' if' для вещей, которые вы в основном хотите поддержать. – sawa

3
number = -42 if opposite 

такая же, как

if opposite 
    number = -42 
end 

Некоторые люди предпочитают одну гильзу для удобства понимания. Представьте себе такую ​​строку, как:

process_payment if order_fulfilled? 

Не так ли?

6

Суффикс стиле if и unless также может быть хорошо для "сторожевых пунктов", в виде:

return if ... 
return unless ... 

Вот пример:

# suffix-style 
def save 
    return false if invalid? 
    # go for it 
    true 
end 

Versus:

# indented style 
def save 
    if valid? 
    # go for it 
    true 
    else 
    false 
    end 
end 

Во втором примере вся реализация метода имеет t o сдвигаться на один отступ из-за проверки valid?, и нам нужен дополнительный пункт else. С типом суффикса проверка invalid? считается краевым кейсом, который мы обрабатываем, а затем выходим из системы, а остальной части метода не требуется отступ или предложение else.

Это иногда называется «оговоркой о защите» и является recommended Руководством по стилю Ruby.

+0

@vgoff Я отредактировал свой ответ, чтобы было ясно, что примерный код должен возвращать разные значения для допустимых и недопустимых путей кода. –

2

Стиль Postfix не содержит раздел else. Это полезно, когда вы только хотите что-то сделать с одним из двух случаев, деленное на условие, и не хотите связываться с другим случаем.

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