Используем ли мы что-либо иначе, кроме инструкции?

Есть мнение о 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
# ...
# ...

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