2

假设我有用户输入,可以是这样的:

input = { user_id: 5, ... }

或这个:

input = { app_id: 5, ... }

我想根据提供的内容返回 :user_id 或 :app_id 。我可以做这个:

(input.keys & [:user_id, :app_id]).first

有没有更优雅,更红宝石,惯用的方式来做到这一点?

这比上面好还是坏?:

input.slice(:user_id, :app_id).keys.first

(答案不需要严格来自 Ruby 2.2 标准库,也欢迎使用 Rails 方法)

4

3 回答 3

5

find我会使用and反过来解决它has_key?

[:user_id, :app_id].find { |k| input.has_key?(k) }
于 2015-12-04T20:30:05.470 回答
1

你的解决方案已经足够好了。我更喜欢的替代方案:

input = { app_id: 5, ... }

KEYS = [:app_id, :user_id, :foo_id]

input.find { |key, value| KEYS.include? key }

这样,您就可以将what您想要的与您想要的分开how。您甚至可以从文件中分配 KEYS,这样您甚至不必打开代码即可在查找中添加或删除键。但这可能是过度工程。

KEYS我会为强硬寻找一个更好的名字。起名很难。

于 2015-12-04T20:59:12.747 回答
1

为什么不只是:

input.key?(:user_id) ? :user_id : :app_id

? 我错过了什么吗?

于 2015-12-05T02:05:52.250 回答