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, kiedy and
należy użyć, można znaleźć w Przewodniku po szynach w sekcji „ Unikanie błędów podwójnego renderowania ”.
&&
, a and
należy go używać tylko w bardzo szczególnych przypadkach.
and
jest if
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. (I or
jest jak odwrócony unless
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:
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
To samo działa dla ||
i or
.
a = foo and bar
i (a = foo ) && bar
dowodzi, że and
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ąc nil
.
Ruby Style Guide mówi lepiej niż ja:
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).
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
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
i or
mają niższy priorytet.
Na przykład, w przeciwieństwie do ||
, or
ma niższy priorytet niż =
:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Podobnie, w przeciwieństwie do &&
, and
ma również niższy priorytet niż =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Co więcej, w przeciwieństwie do &&
i ||
, and
i or
wiążą się z równym pierwszeństwem:
> !puts(1) || !puts(2) && !puts(3)
1
=> true
> !puts(1) or !puts(2) and !puts(3)
1
3
=> true
> !puts(1) or (!puts(2) and !puts(3))
1
=> true
Słabo wiążący and
i or
może być przydatny do celów kontroli przepływu: patrz http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/ .
||
, 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:
def happy?() true; end
def 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
and
ma niższy priorytet, głównie używamy go jako modyfikatora przepływu sterowania, takiego jak if
:
next if widget = widgets.pop
staje się
widget = widgets.pop and next
Dla or
:
raise "Not ready!" unless ready_to_rock?
staje się
ready_to_rock? or raise "Not ready!"
Wolę używać, if
ale nie and
, ponieważ if
jest bardziej zrozumiały, więc po prostu ignoruję and
i or
.
Aby uzyskać więcej informacji, zobacz „ Korzystanie z” i „i” lub w języku Ruby .
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.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true
or
i||
.