在 Ruby 中找到第一个可能匹配的哈希键的优雅方式
Elegant way in Ruby to find first of possible matching hash keys
假设我的用户输入可以是这样的:
input = { user_id: 5, ... }
或者这个:
input = { app_id: 5, ... }
我想 return :user_id 或 :app_id 取决于所提供的。我可以这样做:
(input.keys & [:user_id, :app_id]).first
是否有更优雅、更像 rubyish 的惯用方法?
这比上面更好还是更差?:
input.slice(:user_id, :app_id).keys.first
(答案不需要严格来自 Ruby 2.2 标准库,也欢迎 Rails 方法)
反过来解决
[:user_id, :app_id].find { |k| input.has_key?(k) }
您的解决方案已经足够好了。我更喜欢的替代方案:
input = { app_id: 5, ... }
KEYS = [:app_id, :user_id, :foo_id]
input.find { |key, value| KEYS.include? key }
通过这种方式,您可以将想要的 what
与想要的 how
分开。您甚至可以从文件中分配 KEYS,这样您甚至不必打开代码即可在查找中添加或删除键。但这可能是过度设计。
我会为 KEYS
tough 找一个更好的名字。取名好难
为什么不只是:
input.key?(:user_id) ? :user_id : :app_id
?我错过了什么吗?
假设我的用户输入可以是这样的:
input = { user_id: 5, ... }
或者这个:
input = { app_id: 5, ... }
我想 return :user_id 或 :app_id 取决于所提供的。我可以这样做:
(input.keys & [:user_id, :app_id]).first
是否有更优雅、更像 rubyish 的惯用方法?
这比上面更好还是更差?:
input.slice(:user_id, :app_id).keys.first
(答案不需要严格来自 Ruby 2.2 标准库,也欢迎 Rails 方法)
[:user_id, :app_id].find { |k| input.has_key?(k) }
您的解决方案已经足够好了。我更喜欢的替代方案:
input = { app_id: 5, ... }
KEYS = [:app_id, :user_id, :foo_id]
input.find { |key, value| KEYS.include? key }
通过这种方式,您可以将想要的 what
与想要的 how
分开。您甚至可以从文件中分配 KEYS,这样您甚至不必打开代码即可在查找中添加或删除键。但这可能是过度设计。
我会为 KEYS
tough 找一个更好的名字。取名好难
为什么不只是:
input.key?(:user_id) ? :user_id : :app_id
?我错过了什么吗?