OSTRZEŻENIE: andma nawet niższy priorytet niż =zwykle, którego zwykle będziesz chciał uniknąć and. Przykład, kiedy andnależy użyć, można znaleźć w Przewodniku po szynach w sekcji „ Unikanie błędów podwójnego renderowania ”.
Z linku Andrew Marshalla: „Innym sposobem myślenia andjest ifmodyfikator odwróconego wyrażenia: next if widget = widgets.popstaje się widget = widgets.pop and next. To świetny sposób na umieszczenie go, naprawdę sprawił, że„ kliknął ”w mojej głowie. (I orjest jak odwrócony unlessmodyfikator.)
GMA
1
Połącz tę odpowiedź ze szczegółami odpowiedzi tadmana, a otrzymasz cały obraz.
sargas
5
Avdi zaktualizował swoje zdanie na temat tego, kiedy stosować oraz vs.&&. Zasadniczo używaj „i” i „lub” do sterowania przepływem ze względu na ich niższy priorytet. devblog.avdi.org/2014/08/26/…
EricC
238
Praktyczną różnicą jest siła wiązania, która może prowadzić do szczególnego zachowania, jeśli nie jesteś na to przygotowany:
foo =:foo
bar =nil
a = foo and bar# => nil
a# => :foo
a = foo && bar# => nil
a# => nil
a =(foo and bar)# => nil
a# => nil(a = foo)&& bar# => nil
a# => :foo
a = foo and bari(a = foo ) && bar dowodzi, że andma niższy priorytet niż &&.
sargas
nie rozumiem: co oznacza „foo and bar”?
BKSpurgeon
a = foo and barjest równoważne z (a = :foo) and nil. Ponieważ przypisanie zwraca logicznie prawdziwą wartość ( :foo), druga część ocenia, co kończy się niepowodzeniem, powracając nil.
Użyj && / || dla wyrażeń logicznych i / lub dla przepływu kontrolnego. (Ogólna zasada: jeśli musisz użyć nawiasów zewnętrznych, używasz niewłaściwych operatorów).
@akostadinov na wypadek, gdybyś nie trollował: przewodnik po stylu Ruby nie został napisany przez twórców Ruby. Ruby został stworzony przez Yukihiro Matsumoto i innych, podczas gdy Ruby Style Guide został opracowany głównie przez Bozhidara Batsova.
Andrew Grimm,
2
@AndrewGrimm, dzięki, dobrze wiedzieć. Przepraszam za trollowanie, ale szczerze mylę się z niektórymi aspektami rubinowej rzeczywistości. Jedno jest pewne - każdy projekt ruby potrzebuje ścisłych zasad stylu, aby utrzymać bazę kodową w utrzymaniu.
akostadinov
37
||i &&wiążą się z priorytetem, którego oczekujesz od operatorów logicznych w językach programowania ( &&jest bardzo silny, ||jest nieco mniej silny).
andi ormają niższy priorytet.
Na przykład, w przeciwieństwie do ||, orma niższy priorytet niż =:
> a =false||true=>true> a=>true> a =falseortrue=>true> a=>false
Podobnie, w przeciwieństwie do &&, andma również niższy priorytet niż =:
> a =true&&false=>false> a=>false> a =trueandfalse=>false> a=>true
Co więcej, w przeciwieństwie do &&i ||, andi orwiążą się z równym pierwszeństwem:
„w przeciwieństwie do ||, orma niższy priorytet niż =”… teraz ma to większy sens, dzięki!
Steph Sharp
18
andma niższy priorytet niż &&.
Ale dla niepozornego użytkownika mogą wystąpić problemy, jeśli zostanie on użyty wraz z innymi operatorami, których pierwszeństwo występuje między, na przykład operator przypisania:
def happy?()true;enddef know_it?()true;end
todo = happy?&& know_it??"Clap your hands":"Do Nothing"
todo# => "Clap your hands"
todo = happy?and know_it??"Clap your hands":"Do Nothing"
todo# => true
or
i||
.Odpowiedzi:
and
jest taki sam,&&
ale ma niższy priorytet . Oba używają oceny zwarcia .OSTRZEŻENIE:
and
ma nawet niższy priorytet niż=
zwykle, którego zwykle będziesz chciał uniknąćand
. Przykład, kiedyand
należy użyć, można znaleźć w Przewodniku po szynach w sekcji „ Unikanie błędów podwójnego renderowania ”.źródło
&&
, aand
należy go używać tylko w bardzo szczególnych przypadkach.and
jestif
modyfikator odwróconego wyrażenia:next if widget = widgets.pop
staje sięwidget = widgets.pop and next
. To świetny sposób na umieszczenie go, naprawdę sprawił, że„ kliknął ”w mojej głowie. (Ior
jest jak odwróconyunless
modyfikator.)Praktyczną różnicą jest siła wiązania, która może prowadzić do szczególnego zachowania, jeśli nie jesteś na to przygotowany:
To samo działa dla
||
ior
.źródło
a = foo and bar
i(a = foo ) && bar
dowodzi, żeand
ma niższy priorytet niż&&
.a = foo and bar
jest równoważne z(a = :foo) and nil
. Ponieważ przypisanie zwraca logicznie prawdziwą wartość (:foo
), druga część ocenia, co kończy się niepowodzeniem, powracającnil
.Ruby Style Guide mówi lepiej niż ja:
źródło
and
/or
całkowicie, i mogą mieć rację. Często ich użycie w przepływie kontrolnym może byćif
iunless
tak napisane z / operatorami (np.document.save! unless document.saved?
)||
i&&
wiążą się z priorytetem, którego oczekujesz od operatorów logicznych w językach programowania (&&
jest bardzo silny,||
jest nieco mniej silny).and
ior
mają niższy priorytet.Na przykład, w przeciwieństwie do
||
,or
ma niższy priorytet niż=
:Podobnie, w przeciwieństwie do
&&
,and
ma również niższy priorytet niż=
:Co więcej, w przeciwieństwie do
&&
i||
,and
ior
wiążą się z równym pierwszeństwem:Słabo wiążący
and
ior
może być przydatny do celów kontroli przepływu: patrz http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .źródło
||
,or
ma niższy priorytet niż=
”… teraz ma to większy sens, dzięki!and
ma niższy priorytet niż&&
.Ale dla niepozornego użytkownika mogą wystąpić problemy, jeśli zostanie on użyty wraz z innymi operatorami, których pierwszeństwo występuje między, na przykład operator przypisania:
źródło
and
ma niższy priorytet, głównie używamy go jako modyfikatora przepływu sterowania, takiego jakif
:staje się
Dla
or
:staje się
Wolę używać,
if
ale nieand
, ponieważif
jest bardziej zrozumiały, więc po prostu ignorujęand
ior
.Aby uzyskać więcej informacji, zobacz „ Korzystanie z” i „i” lub w języku Ruby .
źródło
Nie wiem, czy to jest intencja Ruby, czy to błąd, ale wypróbuj poniższy kod. Ten kod został uruchomiony w Ruby w wersji 2.5.1 i był w systemie Linux.
źródło