Булеви оператори

  1. От презентация 01:

    and, or и not правят това, което очаквате &&, || и ! — също Разликата между тях е тънка. Придържайте се към първите

    Няма ли повече логика да се придържаме към... вторите? Разликата, доколкото знам, е само доста по-ниският приоритет на първите. Дори the style guide казва да не се ползват първите.

    Има ли добра причина да използваме основно "and, or" или аз пропускам нещо?

  2. and и or са по-скоро за control flow и code readability.

    Например ако искаш да запазиш, някакъв float целия, но след това да ползваш само закръглена част от него би изглеждало така:
    almost_pi = 3.141592 and do_something(almost_pi.round(2)),
    където ако вместо and бяхме използвали && резултатът щеше да е съвсем друг.

    Друг пример, само че с or е:
    value = possibly_false or raise "Error",
    където ползата на ||, вместо or дава SyntaxError

    След прочита на това измислих примерите - може и да бъркам нещо.

    Колкото за style guide-a, на лекцията ни казаха да ползваме тяхната версия, където препоръчват ползата на 'думичките'.

    Ако трябваше аз да избирам бих ползвал и двете опции в зависимост от ситуацията (value = true && false).

  3. Не споря, че са полезни за control flow, макар и да могат да бъдат заменени с if/unless (почти?) винаги, което е спорно дали е по-четимо.

    Казвам, че не мисля, че са подходящи за булеви изрази, което е доста по-честата употреба на логическите оператори, така че ако трябва да си изберем едни, към които да се "придържаме", не трябва да са те, според мен.

  4. Аз обичам да пиша нещата така:

    if hungry? or thirsty?
      # ...
    end
    
    if hungry? and !thirsty?
      # ...
    end
    
    def hungry_and_thristy?
      hungry? && thristy?
    end
    
    value = possibly_false or raise "Error"
    

    Като никога не мешам and, or с && и ||

    И никога не бих написал нещо от този тип: almost_pi = 3.141592 and do_something(almost_pi.round(2)) Това ми отне няколко минути да разбера какво се случва (за щастие вече и забравих ^^).

    Също не си спомням дали някога съм използвал not

  5. Темата е важна, благодаря, че я започнахте :) Определено ще говорим за това и на лекции, но така и така се е отворила дискусията, ще пиша и тук.

    Съображенията и притесненията, които имате към 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/... и към || и && при изчисления на стойности при присвояване. Извън курса – решението ще е ваше :)

Трябва да сте влезли в системата, за да може да отговаряте на теми.