Существует ли метод ruby или rails, который вернет ключ хэша при проверке ключа хэша?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Учитывая хэш, подобный этому:

 hash = {some_long_key: 1}
  

Я хочу сделать именно это:

 hash[:some_long_key] ? :some_long_key : nil
  

Но по возможности используйте один метод…

 hash.has_key? :some_long_key # like this
hash.check_key? :some_long_key # except return :some_long_key
  

Я хотел бы вернуть ключ, а не логическое значение.

Почти уверен, что этого не существует, но подумал, что я спрошу.

Комментарии:

1. Самое близкое, что я нашел в документах, это hash.assoc(:some_long_key)amp;.first

2. Если известно, что это h[k] не nil если h имеет ключ k , вы могли бы написать h[k] amp;amp; k , но я подозреваю, что это не то, что вам нужно.

3. Что не так с key if hash.key?(key) ? Это кратко, читаемо и легко для понимания. Я не могу представить, как назвать метод, который делает то же самое, и его название настолько короткое, читаемое и понятное.

4. @spickermann, вопрос не ясен, но OP может захотеть избежать if конструкции.

5. Да, @CarySwoveland, ответ Стефана должен быть принятым, но я не знаю, почему мой ответ был таким противоречивым (исправление обезьянами?) : p

Ответ №1:

Rails добавляет presence_in метод для такого рода проблем. Он возвращает получатель, если он включен в аргумент (через include? ) или nil иным образом:

 hash = {some_long_key: 1}

:some_long_key.presence_in(hash)
#=> :some_long_key

:some_other_key.presence_in(hash)
#=> nil
  

Ответ №2:

Я не думаю, что для этого есть метод, я бы просто исправил Hash класс

Редактировать

Ответ @Stefan’s должен быть принятым. Rails presence_in исправляет класс объекта с помощью обезьяны (намного хуже, чем исправление с помощью обезьяны только Hash класса, но я думаю, что исправление с помощью обезьяны подходит для людей, которые проголосовали против, если Rails это делает)

Редактировать

Все знают (на самом деле они не знают почему, но где-то слышали это), что обезьянье исправление — плохая практика, но это явно лучше, чем делать hash.slice(:some_long_key_not_in_hash).keys.first или hash[:some_long_key] ? :some_long_key : nil повсеместно

 class Hash
  def return_key_if_exists?(key)
    self.key?(key) ? key : nil
  end
end
  

Комментарии:

1. Может быть, просто измените свой ответ, чтобы сказать, что если вы действительно хотите, вы можете обезьяной исправить хэш-класс? Но правильный ответ — нет, для этого нет метода, спасибо! Извините за отрицательные отзывы?

2. Комментарий Сагара Пандьи на самом деле может быть лучшим ответом… hash.assoc(:some_long_key)amp;.first но он не очень читаемый.

3. Да, это зависит от вашего случая (вопроса), я не думаю, что исправление обезьяны — это таааак плохо. вам просто нужно знать, где / когда его использовать, и добавить к нему несколько комментариев для дальнейшего использования

4. Я имею в виду, что люди отрицательно отзываются об исправлении ошибок, как только видят это. Я действительно думаю, что лучше знать, что вы исправляете обезьяну Hash и быть с этим особенно осторожным, чем использовать hash.assoc(:some_long_key)amp;.first или другие hash.key? ? : вещи. Если вы собираетесь сделать это несколько раз, это лучший hash.key? подход, но я определенно не стал бы этого делать hash.assoc(:some_long_key)amp;.first

5. @luisenrike вместо того, чтобы обезьяной исправлять базовый класс, вы могли бы просто определить отдельный метод вне Hash класса, например def key_presence(hash, key) ; key if hash.key?(key) ; end