Есть ли альтернатива оператору "<=>" из Perl в C / Objective-C? - PullRequest
2 голосов
/ 05 октября 2011

Я реализую несколько пользовательских селекторов сортировки NSArray, и мне было интересно, есть ли что-то вроде оператора <=> в C / Objective-C?

У меня есть это:

if (self.count == otherObject.count) return 0;
return (self.count > otherObject.count)? 1 : -1;

и хотел бы иметь (как в Perl)

return self.count <=> otherObject.count;

Ответы [ 3 ]

7 голосов
/ 05 октября 2011

Может быть, метод compare: - это то, что вы ищете? NSString, NSNumber и т. Д. Реализуйте это. Все сравниваемые методы в Какао возвращают NSComparisonResult:

enum {
   NSOrderedAscending = -1,
   NSOrderedSame,
   NSOrderedDescending
};
typedef NSInteger NSComparisonResult;

Таким образом, вы можете напрямую использовать возвращаемое целочисленное значение. Предполагая, что count в вашем вопросе является NSNumber, вы можете сделать:

return [self.count compare:otherObject.count];

Если ваш случай ограничен числами и вы хотите использовать только оператора, вы, вероятно, можете использовать старый добрый минус. Но помните о переполнении целых чисел!:

return self.count - otherObject.count;
1 голос
/ 05 октября 2011

Он называется Оператор космического корабля и возник в Perl; кроме Perl, только у Ruby и Groovy.

0 голосов
/ 05 октября 2011

Не в C и, вероятно, не в Objective-C.

Вы можете написать функцию достаточно легко, хотя она будет специфической для определенного типа операнда:

int compare(int x, int y) {
    return x < y ? -1 : (x > y);
}

ИлиВы можете написать макрос, который может быть применен к любому типу с операторами <, == и >, но иногда он будет оценивать свои аргументы более одного раза:

#define COMPARE(x, y) ((x) < (y) ? -1 : ((x) > (y)))

(Примечаниечто обе версии зависят от оператора >, получая 0 для false, 1 для true.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...