Используем ли мы что-либо иначе, кроме инструкции?
Есть мнение о else
что мы не должны использовать его, unless
?
Может ли кто-нибудь объяснить, почему это так, или мы можем идти куда угодно?
Ответы
Ответ 1
Вы определенно можете использовать else
unless
. Например:
x=1
unless x>2
puts "x is 2 or less"
else
puts "x is greater than 2"
end
Будет напечатан "x 2 или меньше".
Но только потому, что вы можете что-то сделать, это не значит, что вам нужно. Чаще всего эти конструкции свернуты, чтобы читать, и вам лучше было бы выразить свое состояние положительным образом, используя простой, if
:
x=1
if x<=2
puts "x is 2 or less"
else
puts "x is greater than 2"
end
Ответ 2
Да, мы можем использовать, 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
Это также может быть причиной того, что это ограничивает нас.
Ответ 3
Ничто не мешает кому-либо использовать, unless - else
. Это совершенно верно. Но остальная часть, если-не-это двойной отрицательный.
В некоторых случаях, unless
это легко понять. Но в сочетании с оператором else
, if - else
всегда легче понять, чем без unless - else
. Представьте себе, что вы пытаетесь понять остальную часть условия " unless - else
. Это двойной негатив, и двойной негатив просто очень не ошибается.
Также, если есть много условий с комбинациями &&
и ||
операторы, unless
становится сложнее понять
Ответ 4
Да, мы можем использовать, unless
с else
. но не лучше всего писать
unless foo
# Foo
else
#Bar
end
Это не более читаемый код. Вот некоторые руководства по стилю кодировки Ruby, которые придерживаются большинство разработчиков.
Ответ 5
Ruby позволяет это, но на английском языке "if... else" (или "if... other") является общей конструкцией, тогда как "если... else" в значительной степени неслыханно, до такой степени, что многие носители языка отклоните его как неправильное.
Это приводит к некоторой путанице с unless/else
в Ruby. Люди, чей родной язык не позволяет это просто не привыкли следовать за ним. Вот почему есть много мнений против этого. Поскольку Ruby поддерживает это, вы, конечно, можете это сделать.
Ответ 6
Технически это прекрасно использовать, 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
. Работа с отрицаниями (или иногда даже двойными отрицаниями) заставляет вас думать дважды. Поэтому сообщество пытается избежать этого.
Но технически это прекрасно...
Ответ 7
Выполняет код, если условие false. Если условие истинно, выполняется код, указанный в предложении else.
x=1
unless x>2
puts "x is less than 2"
else
puts "x is greater than 2"
end
Мы можем использовать другое, если только его плохой подход.
Ответ 8
Было бы целесообразно (более читаемым, чем любой другой альтернативы) использовать, 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 может быть настолько далеким от его состояния, что вы заставите людей прокручивать вверх и вниз, чтобы держать вещи прямо в их головах.
Этот конкретный пример лучше написан без какого- else
...
unless user.staff?
raise SecurityError, 'not authorized'
end
# ...
# ...
# ... lots of code
# ...
# ...
... но это преобразование не всегда возможно.