#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