Если Вы уже получили набор пользовательских задач, Вы используете с nAnt, палкой с ним - Вы не получаете много с MSBuild. Однако, кажется, нет ничего, что может сделать nAnt, тот MSBuild не может в его ядре. Оба могут назвать внешние инструменты, оба могут выполнить находящиеся в.Net пользовательские задачи, и у обоих есть набор задач сообщества там.
Мы используем MSBuild здесь по той же причине, которая Вы - это - система сборки по умолчанию для VS теперь, и у нас не было nAnt-определенного материала для волнения о.
MSBuildCommunityTasks является хорошей сторонней основой задачи для начала, и покрывает большую часть пользовательского материала, который я когда-либо делал в nAnt, включая поддержку Подрывной деятельности и VSS.
точная семантика || являются:
, так что ваше первое выражение работает так: if @controller .controller_name == "projects"
, тогда выражение замыкается и возвращает true
. если нет, он проверяет второе выражение. второй и третий варианты по существу if @ controller.controller_name == "projects"
, поскольку "projects" || «части»
равно «проекты»
. вы можете попробовать это в irb:
>> "projects" || "parts"
=> "projects"
вы хотите сделать
if ["projects", "parts"].include? @controller.controller_name
Разница в порядке того, что происходит. Также || не делает то, что, как вы думаете, в 2 и 3.
Вы также можете сделать
if ['projects','parts'].include?(@controller.controller_name)
для сокращения кода в будущем, если вам нужно будет добавить больше совпадений.
||
также является нулевым оператором объединения, поэтому
"projects" || "parts"
вернет первую строку, которая не является нулевой (в данном случае «проекты»), что означает, что во вторых двух примеры, вы всегда будете оценивать:
if @controller.controller_name == "projects"
Запуская irb, вы можете проверить, что это происходит:
a = "projects"
b = "parts"
a || b
возвращает проекты
Здесь происходит несколько разных вещей:
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, считается «истинным» для целей логической логики ») Обычно == не распространяется на другие операторы. Причина, по которой 3 * (2 + 1)
совпадает с 3 * 2 + 3 * 1
, заключается в том, что умножение распределяется по сложению.
Значение a || выражение будет одним из его аргументов. Таким образом, второй оператор эквивалентен:
if @controller.controller_name == "projects"
|| имеет более низкий приоритет , чем ==, поэтому третий оператор эквивалентен:
if (@controller.controller_name == "projects") || "ports"
Простой способ получить неполное решение -
if ["a", "b", "c"].include? x
На самом деле это не имеет ничего общего с ||
, а скорее с тем, какие значения считаются истинными в рубине. . Все, кроме false и nil, верно.
Логический оператор или || работает с логическими выражениями, поэтому использование он на строках не делает то, что вы хотите.
Есть несколько способов добиться желаемого, которые менее подробны и более читабельны.
Использование 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
Первый сравнивает строковые литералы «проекты» и «части» с переменной @ controller.controller_name
.
Второй оценивает («проекты» || «части» ), который является «проектами», потому что строковый литерал «проекты» ни false
, ни nil
, ни пустая строка, и сравните его с @ controller.controller_name
Третий сравнивает @ controller.controller_name
и «проекты», и если они равны, он возвращает true
, если нет, он возвращает «части», которые равны true
для оператор if
.