2015-06-10 2 views
1

Если у нас есть <, > и ==, общий порядок определяется ими. Зачем нам нужен <=>?Зачем нам нужен оператор космического корабля?

+0

http://stackoverflow.com/questions/827649/what-is-the-ruby-spaceship-operator –

+1

См. Второй ответ по ссылке @AndreyDeineko. Внедряя '<=>' и включая модуль 'Comparable', вы получаете всевозможные приятные вещи. – pjs

+0

@pjs, ответы на вопросы SO не отвечают на '<=>', в зависимости от порядка появления. :-) –

ответ

-1

Оператор "космический корабль" для сравнение, а не равенство. Это похоже на концепцию функции 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 
1

мы Не необходимость <=>.

a<=>b 

эквивалентно:

if a<b 
    return -1 
elsif a>b 
    return 1 
else 
    return 0 
end 

Он есть для удобства и он был взят из Perl.

+0

Я не понимаю вашу точку зрения. Нам определенно нужен метод '<=>', так как другие встроенные методы полагаются на него. И да, результат «<=>» можно получить другими способами, но то же самое можно сказать и о почти всех встроенных методах. –

+0

@CarySwoveland Я вижу вашу мысль. То, как я понял вопрос, ОП было смущено тем, что делал «<=>». Мне казалось, что у него создалось впечатление, что <=> позволяет делать что-то, что вы могли бы сделать с '<','>' и '='. Это была предпосылка, по которой я выбрал свою формулировку. – LukeP

+0

@CarySwoveland Я не хочу «так не нужно» так же, как нам «не нужно» или «потому что у нас есть' не '+' и' – LukeP

-1

Этот оператор иногда называют функцией «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. Я не знаю более эффективного способа сделать сортировку общего назначения.

-1

Вы верны, что существует избыточность между <, ==, > и <=>. Фактически, когда определены <, ==, >, автоматически определяется <=>.

0

<=> является базой Comparable, поэтому вам не нужно выполнять все функции сравнения самостоятельно. Это проще и менее подвержено ошибкам просто реализовать одну функцию вместо трех.

Смежные вопросы