Темата е важна, благодаря, че я започнахте :) Определено ще говорим за това и на лекции, но така и така се е отворила дискусията, ще пиша и тук.
Съображенията и притесненията, които имате към and
и or
са основателни. Те наистина са били предвидени за control flow по дизайн. Операторите &&
и ||
работят както очаквате и както и в други езици. Там няма изненади и това е причината в по-голмята част от Ruby общността да се предпочита този вариант. Това е и препоръката в оригинала на Ruby Style Guide-а на Божо Бацов.
Въпреки това, разликите между двете са прости и лесни за запомняне и са свързани само с разлики в приоритета:
-
and
и or
са с нисък приоритет и and
и or
имат еднакъв приоритет и са "равностойни" (по-нисък приоритет от =
)
-
&&
и ||
са с по-висок приоритет и &&
е по-приоритетно от ||
(по-висок от приоритета на =
)
Следствия от горното са следните случаи:
-
x = foo and bar
реално е (x = foo) and bar
-
x or y and z
реално е (x or y) and z
За разлика от версиите с думи, "традиционните" оператори са така:
-
x = foo && bar
реално е x = (foo && bar)
-
x || y && z
реално е x || (y && z)
Ако човек не знае за приоритета, горните примери могат да го опарят. Ако знае - трудно ще се обърка. Реално, ако се ползват за прости условия в if
/unless
/while
/..., няма разлика (стига да не комбинирате and
и or
, когато лично аз смятам, че изрични скоби за допълнителна яснота няма да са излишни така или иначе).
Общо взето, и аз както Сашо е написал, ползвам and
/or
за условия в if
, а ||
и &&
за изчисление на стойности при присвояване, тъй като вариантите с думи значително подобряват четимостта на условията.
Това наистина е доста спорен въпрос и дори в екипа имаме доста дискусии по темата. В community-то определено се предпочитат по-скоро традиционните версии - &&
и ||
.
В курса ще ви научим на разликата, за да може да прецените сами и да изберете. По време на самия курс, ще ви помолим да се придържате към вариантите с думи за условия в if
/unles
/... и към ||
и &&
при изчисления на стойности при присвояване. Извън курса – решението ще е ваше :)