Ruby — оператор IF и UNLESS

#ruby #if-statement

#ruby #if-оператор

Вопрос:

Я новичок в Ruby, и я сомневаюсь в правильном написании этой части:

 <% if session[:user_id].nil? || (params[:controller] != 'home' amp;amp; params[:action] != 'index') %>
    something
<% else %>  
    something else
<% end %>
  

Но первая часть конструкции IF неверна (особенно часть параметров). Если бы я попробовал это:

 <% if params[:controller] != 'home' amp;amp; params[:action] != 'index' %>
  

Итак, я получил плохие результаты, но если это:

 <% unless params[:controller] == 'home' amp;amp; params[:action] == 'index' %>
  

Итак, теперь я получил уже хорошие результаты…

Где может быть проблема? Что может быть неправильным? Первый код — это то, что мне нужно, но я не знаю, как объединить все….

Комментарии:

1. Если вы задаете вопрос о Ruby, а не о Rails, вам это не нужно <% .

Ответ №1:

A != B AND C != D это НЕ то же самое, что !(A == B AND C == D)

Первый имеет значение true только тогда, когда ОБЕ пары различны. Второе значение истинно, если ЛЮБАЯ пара отличается. В вашем примере, чтобы преобразовать unless в if, вы бы сделали:

 <% if params[:controller] != 'home' || params[:action] != 'index' %>
  

Так что условие истинно, если ОНИ не совпадают.

Прочитайте об этом здесь http://en.wikipedia.org/wiki/Logical_connective

Ответ №2:

Если это работает для вас:

 <% unless params[:controller] == 'home' amp;amp; params[:action] == 'index' %>
  

Эквивалент с if будет:

 <% if !(params[:controller] == 'home' amp;amp; params[:action] == 'index') %>
  

И, передавая это отрицание внутри, вы получаете:

 <% if params[:controller] != 'home' || params[:action] != 'index' %>
  

Обратите внимание, как не только == становится != , но и amp;amp; становится ||