2016-07-28 3 views
12

Существует мнение о заявлении else, что мы не должны использовать его с unless?Мы используем else с инструкцией if?

Может ли кто-нибудь объяснить, почему это так, или мы можем идти туда, где нам нравится?

+8

Если иное не трудно понять, и его можно легко заменить на if if. – Santhosh

+0

Else синтаксис есть в каждый язык. и если это не в javascript, возникает другой вопрос, почему это не в javascript. –

+39

Если это не сложно для читателя, это нормально. Else этого не делают. –

ответ

22

Вы определенно можете использовать else с unless. Например:

x=1 
unless x>2 
    puts "x is 2 or less" 
else 
    puts "x is greater than 2" 
end 

Будет напечатан «x is 2 or less».

Но только потому, что вы можете что-то не значит, что вы должны. Чаще всего, эти конструкции являются запутанными для чтения, и вы бы лучше сформулировать свое состояние в позитивном ключе, используя простой if:

x=1 
if x<=2 
    puts "x is 2 or less" 
else 
    puts "x is greater than 2" 
end 
16

Да, мы можем использовать unless с else. Мы можем свободно ездить везде, где захотим, но у некоторых людей есть мнение, что неплохо использовать else с unless. Нам нужно избегать этого.

К сожалению, если оператор не поддерживает только конструкцию else, то в нем не будет elsif или elseunless.

unless true 
    puts "one" 
elsif true 
    puts "two" 
else 
    puts "three" 
end 

SyntaxError: compile error 
syntax error, unexpected kELSIF, expecting kEND 

Это также может быть причиной того, что он нас ограничивает.

+7

Для людей, которым нравится беспорядок, что 'если' причины, я предлагаю добавить не только' elsif', но и 'elsunless'. – CompuChip

+0

Конечно, поскольку «elsif» является просто короткой рукой для вложения другой, если внутри else, вы всегда можете писать, если ... else {if ... else {if ...}}. Наслаждайтесь отладкой через 6 месяцев, хотя ... – IMSoP

+0

Если это сработало «puts», три «' никогда не будут выполнены. –

5

Ничего не мешает кому-либо использовать unless else. Это совершенно верно.

Но unless else трудно понять, и он всегда может быть легко заменен if else

например:

unless arr.empty? 
    stmnt_a 
else 
    stmnt_b 
end 


if arr.empty? 
    stmnt_b 
else 
    stmnt_a 
end 

Какой из вышеперечисленного легче понять?

+2

Оба легко понять. В конце концов, это решение разработчика. Во-вторых, разработчик рельсов часто использует, если это не так просто для понимания. –

+0

Мой пример был плохим.Человек, который написал код, может легко понять это. Но для другого человека, смотрящего на код, может показаться, что он немного запутан. Более того, мы говорим о том, если с другим условием. – Santhosh

+1

Rails-разработчики могут часто использовать его и, следовательно, не имеют проблем с 'if', I - как разработчиком не-rails. Один из девизов, который я когда-то нашел, - это: «Не затушевывайте свое (булево) утверждение ненужными слоями отрицания».) (Https://schneide.wordpress.com/2014/08/03/dont-ever-not -avoid-negative-logic /) –

0

Выполняет код, если условие ложно. Если условие истинно, выполняется код, указанный в предложении else.

x=1 
unless x>2 
    puts "x is less than 2" 
else 
    puts "x is greater than 2" 
end 

Мы можем использовать другое с помощью, если только это не плохой подход.

4

Да, мы можем использовать unless с else. но не рекомендуется писать

unless foo 
    # Foo 
else 
    #Bar 
end 

Это не более читаемый код. Here - это руководство по стилю кодировки Ruby, которое придерживается большинство разработчиков.

+0

Да, спасибо, я обновляю ссылку – hgsongra

2

Технически это прекрасно использовать unless с else:

unless user.staff? 
    # do foo 
else 
    # do bar 
end 

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

Таким образом, вы можете изменить его на:

if !user.staff? 
    # do bar 
else 
    # do foo 
end 

Или еще лучше сделать удалить отрицанием из условия полностью:

if user.customer? 
    # do bar 
else 
    # do foo 
end 

if true только легче понять и проще разобрать в вы головой, чем if !true или unless true. Работа с отрицаниями (или иногда даже двойными отрицаниями) заставляет вас думать дважды. Поэтому сообщество пытается избежать этого.

Но технически это хорошо ...

4

Рубин позволяет, но на английском языке «если ... еще» (или «если ... иначе») является общим строительство, тогда как «если. .. else "в значительной степени неслыханно, до такой степени, что многие носители языка отвергли бы его как неправильное.

Это приводит к некоторой путанице с unless/else в Ruby. Люди, чей родной язык не позволяет это просто не привыкли следовать за ним. Вот почему есть много мнений против этого. Поскольку Ruby поддерживает это, вы, конечно, можете это сделать.

1

Было бы целесообразно (более читаемым, чем любой другой альтернативы), чтобы использовать unless ... else ... когда код в блоке else очень долго, и код в блоке unless очень коротка.

unless user.staff? 
    raise SecurityError, 'not authorized' 
else 
    # ... 
    # ... 
    # ... lots of code 
    # ... 
    # ... 
end 

Если вы написали это наоборот,

if user.staff? 
    # ... 
    # ... 
    # ... lots of code 
    # ... 
    # ... 
else 
    raise SecurityError, 'not authorized' 
end 

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

Этот конкретный пример лучше написана без else вообще ...

unless user.staff? 
    raise SecurityError, 'not authorized' 
end 

# ... 
# ... 
# ... lots of code 
# ... 
# ... 

... но это преобразование не всегда возможно.

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