Каков наилучший способ проверить, определены ли все объекты в хеше Ruby (но нет)?Как подтвердить, что все элементы хэша определены?
Заявление должно возвращать значение false, если хотя бы один элемент в хеш равен нулю.
Каков наилучший способ проверить, определены ли все объекты в хеше Ruby (но нет)?Как подтвердить, что все элементы хэша определены?
Заявление должно возвращать значение false, если хотя бы один элемент в хеш равен нулю.
Вы можете использовать all?
, чтобы проверить, является ли данный предикат истинным для всех элементов перечислимого. Итак:
hash.values.all? {|x| !x.nil?}
Или
hash.all? {|k,v| !v.nil?}
Если вы хотите, чтобы проверить, все ключи не являются нулевыми, а также, вы можете изменить, что:
hash.all? {|k,v| !v.nil? && !k.nil?}
Enumerable#all?
метод делает именно то, что вам нужно.
Другой способ:
!hash.values.include? nil
Кстати, в Rails это еще лучше: 'hash.values.exclude? nil' –
Элемент (значение), которое является nil
определен. Он определяется как объект nil
.
Если Вы желаете, чтобы проверить, есть ли какие-либо клавиши не хватает, то сделайте следующее:
hash = {:key1 => nil, :key2 => 42, :key3 => false}
keys = [:key1, :key2, :key3]
all_defined = keys.all?{|key| hash.has_key?(key)} # Returns true
Без блока 'все' автоматически проверяет, если (массив) элементы не являются нулевыми, так проверка значения может быть уменьшена до 'hash.values.all?', а ключи + значения проверяются на 'hash.flatten.all?'! –
@glenn: Не совсем. Он проверяет, что они правдивы. 'false' не' nil', но это также не правдиво. – sepp2k
Если вы на рубине 1.8.7 или новее, или на Rails, вы можете сделать '! hash.values.any? (&: nil?) '. –