Почему бы не позволить библиотеке проверить ее для вас? Не следует вводить сложные регулярные выражения, которые невозможно поддерживать.
% gem install ipaddress
Затем в вашем приложении
require "ipaddress"
IPAddress.valid? "192.128.0.12"
#=> true
IPAddress.valid? "192.128.0.260"
#=> false
# Validate IPv6 addresses without additional work.
IPAddress.valid? "ff02::1"
#=> true
IPAddress.valid? "ff02::ff::1"
#=> false
IPAddress.valid_ipv4? "192.128.0.12"
#=> true
IPAddress.valid_ipv6? "192.128.0.12"
#=> false
Вы также можете использовать встроенный в Ruby класс IPAddr
, но он не очень хорошо подходит для проверки.
Конечно, если IP-адрес предоставляется вам сервером приложений или инфраструктурой, нет никаких оснований для проверки вообще. Просто используйте предоставленную вам информацию и изящно обработайте любые исключения.
NSSet
используется, когда вы часто хотите проверить членство объекта, но не заботитесь о порядке и не нуждаетесь в коллекции для содержат повторяющиеся объекты. NSSet
не хранит свои объекты в каком-либо определенном порядке; скорее, класс специально разработан для эффективной проверки того, существует ли объект в коллекции.
То же самое касается NSCountedSet
, хотя NSCountedSet
также сохраняет подсчитать дублированных объектов.
Итак, в двух словах: используйте набор, когда вы беспокоитесь о тестировании на членство , а не просто храните коллекцию объектов (некоторые из которых могут быть дублированным, как было решено каким-то методом isEqualTo
).
В дополнение к другим ответам, которые говорят в основном о наборах, но не столько о подсчитываемых наборах, вы можете задаться вопросом, когда лучше всего использовать счетный набор. Подсчитываемый набор полезен для таких вещей, как взвешивание или другие статистические алгоритмы: в конце вы можете в конечном итоге создать упорядоченный массив его содержимого, отсортированный с использованием сохраненного счетчика.
Другой вариант - это уникальные таблицы или форма ссылки счетчик / сборщик мусора. Использование подсчитываемого набора позволит включить тесты (т. Е. Вернуть существующий идентичный объект, а не создавать новый - аналогично тому, что CoreData делает внутри), одновременно выполняя своего рода подсчет ссылок на значения, которые он включает, поскольку объект будет только освобождается набором, когда его счетчик достигает 0.
Вслед за midpadi, многие виды использования NSArray следует заменить на NSSet. NSSet - это набор уникальных объектов. NSArray - это набор упорядоченных объектов. Если ваши объекты не имеют внутреннего порядка и уникальны, вам следует использовать NSSet.
Я очень часто сохраняю NSSet на уровне модели и позволяю компонентам пользовательского интерфейса, которым требуется порядок, создавать свои собственные массивы NSArrays. Например, рассмотрим случай со «списком друзей», состоящим из «приятелей». Сам список друзей неупорядочен; это просто коллекция. И объекты должны быть уникальными. Однако на уровне пользовательского интерфейса вам нужен порядок, и вы можете даже захотеть поместить одного и того же собеседника в несколько групп (например, «Избранное» и «Не в сети»). Но это проблемы пользовательского интерфейса, и слой модели не должен о них беспокоиться.
NSSet *buddies = [buddyList allBuddies];
BOOL isBuddy = [buddyList containsObject:buddy];
NSArray *buddyList = [[buddyList allBuddies] sortedAraryUsingSelector:[self buddySortSelector]];
Когда появляется новый приятель, BuddyList отправит уведомление ( BuddyListDidAddBuddiesNotification
), которое включает NSSet добавленных друзей в его userInfo. Таким образом, элементы пользовательского интерфейса, наблюдающие за этим, могут вставлять друзей в свои списки в любом подходящем порядке сортировки. Это делает анимацию списков очень простой, что намного сложнее, если вы сохраните все свои отсортированные версии на уровне модели.
Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.
Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.
который включает NSSet добавленных друзей в свой userInfo. Таким образом, элементы пользовательского интерфейса, наблюдающие за этим, могут вставлять друзей в свои списки в любом подходящем порядке сортировки. Это делает анимацию списков очень простой, что намного сложнее, если вы сохраните все свои отсортированные версии на уровне модели.Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.
Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.
который включает NSSet добавленных друзей в свой userInfo. Таким образом, элементы пользовательского интерфейса, наблюдающие за этим, могут вставлять друзей в свои списки в любом подходящем порядке сортировки. Это делает анимацию списков очень простой, что намного сложнее, если вы сохраните все свои отсортированные версии на уровне модели.Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.
Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.
Таким образом, элементы пользовательского интерфейса, наблюдающие за этим, могут вставлять друзей в свои списки в любом подходящем порядке сортировки. Это делает анимацию списков очень простой, что намного сложнее, если вы сохраните все свои отсортированные версии на уровне модели.Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.
Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.
Таким образом, элементы пользовательского интерфейса, наблюдающие за этим, могут вставлять друзей в свои списки в любом подходящем порядке сортировки. Это делает анимацию списков очень простой, что намного сложнее, если вы сохраните все свои отсортированные версии на уровне модели.Когда у вас есть два NSSet, довольно легко выяснить различия между ними и построить серию удалений и добавлений чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.
Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.
Достаточно легко выяснить различия между ними и построить серию удалений и добавлений, чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.
Достаточно легко выяснить различия между ними и построить серию удалений и добавлений, чтобы превратить одно в другое (опять же, полезно для анимации). С NSArray сделать это намного сложнее.Поэтому я рекомендую по умолчанию использовать NSSet. Вы должны использовать NSArray только тогда, когда вам действительно нужен заказ. К сожалению, это не так, как делают большинство людей.