Существует мнение о заявлении else
, что мы не должны использовать его с unless
?Мы используем else с инструкцией if?
Может ли кто-нибудь объяснить, почему это так, или мы можем идти туда, где нам нравится?
Существует мнение о заявлении else
, что мы не должны использовать его с unless
?Мы используем else с инструкцией if?
Может ли кто-нибудь объяснить, почему это так, или мы можем идти туда, где нам нравится?
Вы определенно можете использовать 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
Да, мы можем использовать 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
Это также может быть причиной того, что он нас ограничивает.
Для людей, которым нравится беспорядок, что 'если' причины, я предлагаю добавить не только' elsif', но и 'elsunless'. – CompuChip
Конечно, поскольку «elsif» является просто короткой рукой для вложения другой, если внутри else, вы всегда можете писать, если ... else {if ... else {if ...}}. Наслаждайтесь отладкой через 6 месяцев, хотя ... – IMSoP
Если это сработало «puts», три «' никогда не будут выполнены. –
Ничего не мешает кому-либо использовать unless else
. Это совершенно верно.
Но unless else
трудно понять, и он всегда может быть легко заменен if else
например:
unless arr.empty?
stmnt_a
else
stmnt_b
end
if arr.empty?
stmnt_b
else
stmnt_a
end
Какой из вышеперечисленного легче понять?
Оба легко понять. В конце концов, это решение разработчика. Во-вторых, разработчик рельсов часто использует, если это не так просто для понимания. –
Мой пример был плохим.Человек, который написал код, может легко понять это. Но для другого человека, смотрящего на код, может показаться, что он немного запутан. Более того, мы говорим о том, если с другим условием. – Santhosh
Rails-разработчики могут часто использовать его и, следовательно, не имеют проблем с 'if', I - как разработчиком не-rails. Один из девизов, который я когда-то нашел, - это: «Не затушевывайте свое (булево) утверждение ненужными слоями отрицания».) (Https://schneide.wordpress.com/2014/08/03/dont-ever-not -avoid-negative-logic /) –
Выполняет код, если условие ложно. Если условие истинно, выполняется код, указанный в предложении else.
x=1
unless x>2
puts "x is less than 2"
else
puts "x is greater than 2"
end
Мы можем использовать другое с помощью, если только это не плохой подход.
Технически это прекрасно использовать 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
. Работа с отрицаниями (или иногда даже двойными отрицаниями) заставляет вас думать дважды. Поэтому сообщество пытается избежать этого.
Но технически это хорошо ...
Рубин позволяет, но на английском языке «если ... еще» (или «если ... иначе») является общим строительство, тогда как «если. .. else "в значительной степени неслыханно, до такой степени, что многие носители языка отвергли бы его как неправильное.
Это приводит к некоторой путанице с unless/else
в Ruby. Люди, чей родной язык не позволяет это просто не привыкли следовать за ним. Вот почему есть много мнений против этого. Поскольку Ruby поддерживает это, вы, конечно, можете это сделать.
Было бы целесообразно (более читаемым, чем любой другой альтернативы), чтобы использовать 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
# ...
# ...
... но это преобразование не всегда возможно.
Если иное не трудно понять, и его можно легко заменить на if if. – Santhosh
Else синтаксис есть в каждый язык. и если это не в javascript, возникает другой вопрос, почему это не в javascript. –
Если это не сложно для читателя, это нормально. Else этого не делают. –