Поиск рубинового хэша для пустого значения - PullRequest
7 голосов
/ 07 сентября 2010

У меня есть такой хэш ruby ​​
h = {"a" => "1", "b" => "", "c" => "2"}
Теперь у меня есть функция ruby, которая оценивает этот хэш и возвращает true, если находит ключ с пустым значением.У меня есть следующая функция, которая всегда возвращает true, даже если все ключи в хэше не пусты

def hash_has_blank(hsh)  
  hsh.each do |k,v|  
    if v.empty?  
      return true  
    end  
  end
  return false
 end

Что я делаю здесь неправильно?Пожалуйста, помогите

Спасибо, Абхи

Ответы [ 4 ]

18 голосов
/ 07 сентября 2010

Попробуйте это:

def hash_has_blank hsh
    hsh.values.any? &:empty?
end

Или:

def hash_has_blank hsh
    hsh.values.any?{|i|i.empty?}
end

Если вы используете старый 1.8.x Ruby

8 голосов
/ 07 сентября 2010

Я надеюсь, что вы готовы изучить магию рубина здесь.Я бы не стал определять такую ​​функцию глобально, как вы.Если это операция с хешем, то это должен быть метод экземпляра класса Hash, вы можете сделать это следующим образом:

class Hash
  def has_blank?
    self.reject{|k,v| !v.nil? || v.length > 0}.size > 0
  end
end

reject вернет новый хеш со всеми пустыми строками, ичем будет проверено, насколько велик этот новый хеш.

возможно более эффективный способ (он не должен проходить через весь массив):

class Hash
  def has_blank?
    self.values.any?{|v| v.nil? || v.length == 0}
  end
end

Но это все равно будет проходить через весьхэш, если нет пустого значения

Я изменил empty? на !nil? || length >0, потому что я не знаю, как работает ваш метод empty.

5 голосов
/ 07 сентября 2010

Если вы просто хотите проверить, является ли какое-либо из значений пустой строкой, вы можете сделать

h.has_value?('')

, но ваша функция работает нормально.

4 голосов
/ 07 сентября 2010

Я бы подумал о рефакторинге вашего модельного домена.Очевидно, хеш представляет собой нечто осязаемое.Почему бы не сделать это объектом?Если элемент может быть полностью представлен хешем, вы можете создать подкласс Hash.Если это более сложно, хеш может быть атрибутом.

Во-вторых, причина, по которой вы проверяете пробелы, может быть названа так, чтобы лучше отражать ваш домен.Вы не сказали нам «почему», но давайте предположим, что ваш Предмет действителен, только если у него нет пустых значений.

class MyItem < Hash

  def valid?
    !invalid?
  end

  def invalid?
    values.any?{|i| i.empty?}
  end
end

Дело в том, что если вы можете установить словарь, которыйимеет смысл в вашем домене, ваш код будет чище и понятнее.Использование хэша - это всего лишь средство для достижения цели, и вам лучше использовать более описательные термины, относящиеся к домену.

Используя приведенный выше пример, вы сможете:

my_item = MyItem["a" => "1", "b" => "", "c" => "2"]

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