Понимание “||” операция ИЛИ, в Если условные выражения в Ruby

Если Вы уже получили набор пользовательских задач, Вы используете с nAnt, палкой с ним - Вы не получаете много с MSBuild. Однако, кажется, нет ничего, что может сделать nAnt, тот MSBuild не может в его ядре. Оба могут назвать внешние инструменты, оба могут выполнить находящиеся в.Net пользовательские задачи, и у обоих есть набор задач сообщества там.

Мы используем MSBuild здесь по той же причине, которая Вы - это - система сборки по умолчанию для VS теперь, и у нас не было nAnt-определенного материала для волнения о.

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

37
задан Simone Carletti 9 October 2010 в 21:20
поделиться

8 ответов

точная семантика || являются:

  • если первое выражение не равно nil или false, вернуть его
  • если первое выражение равно nil или false, вернуть второе выражение

, так что ваше первое выражение работает так: if @controller .controller_name == "projects" , тогда выражение замыкается и возвращает true . если нет, он проверяет второе выражение. второй и третий варианты по существу if @ controller.controller_name == "projects" , поскольку "projects" || «части» равно «проекты» . вы можете попробовать это в irb:

>> "projects" || "parts"
=> "projects"

вы хотите сделать

if ["projects", "parts"].include? @controller.controller_name
57
ответ дан 27 November 2019 в 04:28
поделиться

Разница в порядке того, что происходит. Также || не делает то, что, как вы думаете, в 2 и 3.

Вы также можете сделать

if ['projects','parts'].include?(@controller.controller_name)

для сокращения кода в будущем, если вам нужно будет добавить больше совпадений.

7
ответ дан 27 November 2019 в 04:28
поделиться

|| также является нулевым оператором объединения, поэтому

"projects" || "parts"

вернет первую строку, которая не является нулевой (в данном случае «проекты»), что означает, что во вторых двух примеры, вы всегда будете оценивать:

if @controller.controller_name == "projects"

Запуская irb, вы можете проверить, что это происходит:

a = "projects"
b = "parts"

a || b

возвращает проекты

6
ответ дан 27 November 2019 в 04:28
поделиться

Здесь происходит несколько разных вещей:

if @controller.controller_name == "projects" || @controller.controller_name == "parts"

это дает поведение, которое вы хотите, я предполагаю. Логика довольно проста: вернуть истину, если имя контроллера - «проекты» или «части»

Другой способ сделать это:

if ["projects", "parts", "something else..."].include? @controller.controller_name

Это проверит, находится ли имя контроллера где-нибудь в списке.

Теперь о других примерах:

if @controller.controller_name == ("projects" || "parts")

Это не будет делать то, что вы хотите. Сначала он оценит ("проекты" || "части") (что приведет к "проектам"), а затем только проверит, совпадает ли имя контроллера с этим.

if @controller.controller_name == "projects" || "parts"

Этот получает еще более дурацкий. Это всегда будет истинным. Сначала он проверит, совпадает ли имя контроллера с «projects». Если это так, утверждение истинно. Если нет, он оценивает «части» самостоятельно: что также оценивается как «истина» в ruby ​​(любой объект, отличный от nil, считается «истинным» для целей логической логики »)

Сначала он проверит, совпадает ли имя контроллера с «projects». Если это так, утверждение истинно. Если нет, он оценивает «части» самостоятельно: что также оценивается как «истина» в ruby ​​(любой объект, отличный от nil, считается «истинным» для целей логической логики »)

Сначала он проверит, совпадает ли имя контроллера с «projects». Если это так, утверждение истинно. Если нет, он оценивает «части» самостоятельно: что также оценивается как «истина» в ruby ​​(любой объект, отличный от nil, считается «истинным» для целей логической логики »)

6
ответ дан 27 November 2019 в 04:28
поделиться

Обычно == не распространяется на другие операторы. Причина, по которой 3 * (2 + 1) совпадает с 3 * 2 + 3 * 1 , заключается в том, что умножение распределяется по сложению.

Значение a || выражение будет одним из его аргументов. Таким образом, второй оператор эквивалентен:

if @controller.controller_name == "projects"

|| имеет более низкий приоритет , чем ==, поэтому третий оператор эквивалентен:

if (@controller.controller_name == "projects") || "ports"
3
ответ дан 27 November 2019 в 04:28
поделиться

Простой способ получить неполное решение -

if ["a", "b", "c"].include? x

На самом деле это не имеет ничего общего с || , а скорее с тем, какие значения считаются истинными в рубине. . Все, кроме false и nil, верно.

2
ответ дан 27 November 2019 в 04:28
поделиться

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

Есть несколько способов добиться желаемого, которые менее подробны и более читабельны.

Использование Array # include? и простой оператор if:

if ["projects", "parts"].include? @controller.controller_name
  do_something
else
  do_something_else
end

Использование оператора case:

case @controller.controller_name
when "projects", "parts" then
  do_something
else
  do_something_else
end
1
ответ дан 27 November 2019 в 04:28
поделиться

Первый сравнивает строковые литералы «проекты» и «части» с переменной @ controller.controller_name .

Второй оценивает («проекты» || «части» ), который является «проектами», потому что строковый литерал «проекты» ни false , ни nil , ни пустая строка, и сравните его с @ controller.controller_name

Третий сравнивает @ controller.controller_name и «проекты», и если они равны, он возвращает true , если нет, он возвращает «части», которые равны true для оператор if .

0
ответ дан 27 November 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: