Если у нас есть <
, >
и ==
, общий порядок определяется ими. Зачем нам нужен <=>
?Зачем нам нужен оператор космического корабля?
ответ
Оператор "космический корабль" для сравнение, а не равенство. Это похоже на концепцию функции strcmp
.
Из String
класса:
string <=> other_string
→ -1, 0, +1 или нольСравнение - возвращает -1, 0, +1 или ноль в зависимости от того, является ли строка меньше, равный или больше, чем other_string.
Короче говоря, ==
возвращает логическое значение, выражающее равенство, в то время как <=>
возвращает число, выражающее значение сравнительного. Если первый объект имеет большее значение, чем второй, <=>
возвращает +1
. Если он имеет меньшее значение, возвращается -1
. Если они имеют одинаковое значение, возвращается 0
.
«Значение» объекта может быть определено как угодно. Однако для String
<=>
проверяет lexicographic ordering двух аргументов.
Поэтому:
"abc" == "abc" # true
("abc" <=> "abc") == 0 # true
мы Не необходимость <=>
.
a<=>b
эквивалентно:
if a<b
return -1
elsif a>b
return 1
else
return 0
end
Он есть для удобства и он был взят из Perl.
Я не понимаю вашу точку зрения. Нам определенно нужен метод '<=>', так как другие встроенные методы полагаются на него. И да, результат «<=>» можно получить другими способами, но то же самое можно сказать и о почти всех встроенных методах. –
@CarySwoveland Я вижу вашу мысль. То, как я понял вопрос, ОП было смущено тем, что делал «<=>». Мне казалось, что у него создалось впечатление, что <=> позволяет делать что-то, что вы могли бы сделать с '<','>' и '='. Это была предпосылка, по которой я выбрал свою формулировку. – LukeP
@CarySwoveland Я не хочу «так не нужно» так же, как нам «не нужно» или «потому что у нас есть' не '+' и' – LukeP
Этот оператор иногда называют функцией «signum». Он обеспечивает наиболее сжатый способ настройки порядка сортировки. Например:
require "ostruct"
# Fake "rows" with OpenStructs
my_data = [
OpenStruct.new({ :name => "Ben", :age => 50 }),
OpenStruct.new({ :name => "Abe", :age => 50 }),
OpenStruct.new({ :name => "Cab", :age => 51 })
]
# Sort by age descending, then name ascending
puts my_data.sort { |a, b| 2 * (b.age <=> a.age) + (a.name <=> b.name) }
Это работает потому, что значение из <=>
всегда -1, 0 или 1. Я не знаю более эффективного способа сделать сортировку общего назначения.
Вы верны, что существует избыточность между <
, ==
, >
и <=>
. Фактически, когда определены <
, ==
, >
, автоматически определяется <=>
.
<=>
является базой Comparable, поэтому вам не нужно выполнять все функции сравнения самостоятельно. Это проще и менее подвержено ошибкам просто реализовать одну функцию вместо трех.
- 1. Зачем нам нужен новый оператор?
- 2. Зачем нам нужен оператор «delete []»?
- 3. uasort с <=> (оператор космического корабля)
- 4. Перевернутый оператор космического корабля Ruby <=>
- 5. Оператор космического корабля и условные заявления
- 6. Толчок космического корабля около
- 7. Движение космического корабля
- 8. Зачем нам нужен org.junit.ComparisonFailure?
- 9. Зачем нам нужен Control.Lens.Reified?
- 10. Зачем нам нужен contexClassLoader
- 11. Зачем нам нужен mktemp?
- 12. Зачем нам нужен strdup()?
- 13. Зачем нам нужен cmake?
- 14. Зачем нам нужен кеш?
- 15. Зачем нам нужен enabled_shared_from_this
- 16. Зачем нам нужен конструктор?
- 17. Зачем нам нужен @GeneratedValue?
- 18. Понижающая скорость моего космического корабля
- 19. Меню космического корабля с CSS
- 20. процедурная генерация спрайтов космического корабля
- 21. Завершение космического корабля за время
- 22. Что такое <=> («Оператор космического корабля») в PHP 7?
- 23. Как операторы сравнения (оператор космического корабля) обрабатываются в тройных операторах
- 24. Как подключить оператор космического корабля groovy для многоуровневой сортировки?
- 25. Зачем нам нужен частный конструктор?
- 26. Зачем нам нужен обратный адрес?
- 27. Зачем нам нужен сервер Fuseki?
- 28. Зачем нам нужен длинный тип?
- 29. Зачем нам нужен сгенерированный код?
- 30. Зачем нам нужен полукруглый разъем?
http://stackoverflow.com/questions/827649/what-is-the-ruby-spaceship-operator –
См. Второй ответ по ссылке @AndreyDeineko. Внедряя '<=>' и включая модуль 'Comparable', вы получаете всевозможные приятные вещи. – pjs
@pjs, ответы на вопросы SO не отвечают на '<=>', в зависимости от порядка появления. :-) –