Zastanawiam się, dlaczego ruby dają and
, or
mniej pierwszeństwa niż &&
, ||
i przypisują operatora? Czy istnieje jakiś powód?Czy za "i", "lub" operatorami w Ruby jest jakaś mądrość?
Odpowiedz
Domyślam się, że jest to bezpośrednie przeniesienie z Perla. Operatory or
i and
zostały dodane później w Perlu 5, dla szczególnych sytuacji pożądany był niższy priorytet.
Na przykład w Perlu, tutaj chcemy że ||
miał niższy priorytet, tak, że możemy napisać:
try to perform big long hairy complicated action || die ;
i mieć pewność, że ||
nie zamierza pochłaniają część akcji. Perl 5 wprowadził nową wersję or
, która ma niski priorytet, właśnie w tym celu.
Przykładem w Ruby, gdzie można użyć or
ale nie ||
:
value = possibly_false or raise "foo"
Jeśli użyto ||
, byłby to błąd składni.
Możliwość kontrolowania pierwszeństwa operatorów jest czasem przydatna, szczególnie jeśli chodzi o czytelność - dodatkowy nawias w instrukcjach warunkowych może czasami zaciemniać rzeczywistą logikę.
Uważam jednak, że powód, dla którego Ruby ma najwyższy poziom boolowskich operatorów, wynika przede wszystkim z faktu, że Matz był programistą Perla, zanim jeszcze napisał Rubiego, i pożyczył wiele podstawowych składni i operatorów od ten język.
hmm, to wyjaśnia, dlaczego rubin jest tak niedojrzały, a jednocześnie tak rozdęty. Wciąż ciężko owinąć mi głowę ... – akostadinov
Mają bardzo niski priorytet, dlatego operandy nie muszą być zawijane w nawiasy, jak to czasami bywa w przypadku &&
i ||
.
Uważam, że pomysł polega na tym, aby umieścić je poniżej operatorów przydziału, dzięki czemu można pisać testy logiczne z zadaniami, ale bez parens.
Różnica jest ważniejsza. ||
, &&
mają wyższy priorytet niż =
, ale and
, or
mają niższe. Tak więc, można zrobić:
a = nil || 0
Trzeba by zrobić:
a = (nil or 0)
aby uzyskać ten sam efekt. Jeśli wykonasz:
a = nil or 0
Wynik wyrażenia będzie nadal wynosił 0, ale wartość będzie zerowa.
- 1. Czy jest jakaś różnica między "! =" I "<>" w Oracle Sql?
- 2. Logowanie w Railsach, czy jest jakaś skuteczność?
- 3. Czy jest jakaś różnica między Integer i Int32 w VB.NET?
- 4. czy jest jakaś pula dla ThreadingMixIn i ForkingMixIn dla SocketServer?
- 5. Jaka jest różnica między operatorami kostki, rollupu i groupBy?
- 6. Czy jest jakaś różnica między UTF8Encoding.UTF8.GetBytes i Encoding.UTF8.GetBytes?
- 7. Czy jest jakaś dekompresja zip dla iPhone'a?
- 8. Czy jest jakaś otwarta alternatywa dla talky.io?
- 9. Czy jest jakaś różnica między serwerem ember i serwerem ember
- 10. Czy istnieje jakaś koncepcja DLL lub DLL w Androidzie?
- 11. Czy jest jakaś wtyczka websocket dla IE?
- 12. Różne zachowanie między operatorami CString "+ =" i "+"
- 13. Czy jest jakaś maszyna wirtualna Smalltalk i/lub obraz obsługujący 64-bitowe?
- 14. Czy jest jakaś opcja do listy grup w Ansible?
- 15. Czy jest jakaś korzyść z używania AND i OR przez && i || w PHP?
- 16. Czy jest jakaś korzyść z używania wartości null w PHP?
- 17. Uzyskaj lub oblicz entropię obrazu za pomocą Ruby i imagemagick
- 18. W kompilacji ScalaJs sbt, czy jest jakaś korzyść używać webjars zamiast npm lub altana z "Provided"?
- 19. Czy jest jakaś różnica w używaniu operatora "+" do wypychania?
- 20. Czy jest jakaś różnica między 1U a 1 w c?
- 21. Przecinek między operatorami w C++
- 22. Czy jest jakaś łatwa w użyciu biblioteka JavaScript XML polecająca?
- 23. Czy jest jakaś różnica między wywołaniem metody klasy Ruby a metodą klasową zi bez siebie?
- 24. Czy sortowanie w Ruby jest stabilne?
- 25. Czy jest jakaś wymiana AssemblyBuilder.DefineDynamicAssembly w .NET Core?
- 26. Czy jest jakaś czcionka wyglądająca jak LED w telefonie iPhone?
- 27. Czy jest jakaś sztuczka do wyświetlania obrazów svg w Gmailu?
- 28. Czy jest jakaś sztuczka do używania wykresów d3 w jsf?
- 29. Czy istnieje jakaś logika za zamawianiem kodów ASCII?
- 30. Czy jest jakaś różnica między ".i Zwrotem (...). AnyTimes()" i ".andStubReturn (...)" w EasyMock?
Czy istnieje nazwa idiomu do_something lub die? Czy używa się go w rubinach? –
Nie znam żadnej nazwy, ale jest dość powszechne w Ruby. – Chuck
Perl pochyla się ciężko na kostce, podczas gdy Ruby używa podbicia. Zaletą wyjątku jest to, że możesz go uratować. – tadman