首页 > 解决方案 > Rails 哈希空值检查 - 'if-condition' 和'三元运算符'哪个更好?

问题描述

我有以下哈希

instance_options[:param_page]
instance_options[:param_page][:comment_page]
instance_options[:param_page][:comment_per]

我需要comment_page,comment_per 值我做了重构代码但我不确定什么是最好的散列空检查让我知道最好的空检查如果你认识其他人

之前

comment_page = 1
comment_per = 0
param_page = instance_options[:param_page]
if param_page
  comment_page = param_page[:comment_page].presence || comment_page
  comment_per = param_page[:comment_per].presence || comment_per
end

comment_page = instance_options[:param_page][:comment_page].present? ? instance_options[:param_page][:comment_page] : 1
comment_per = instance_options[:param_page][:comment_per].present? ? instance_options[:param_page][:comment_per] : 10

标签: ruby-on-railshashnull-check

解决方案


你更进一步:

comment_page = instance_options.dig(:param_page, :comment_page).presence || 1
comment_per  = instance_options.dig(:param_page, :comment_per).presence || 0

这将挖掘instance_options两次,但成本将是微不足道的。如果您需要担心类型(比如:comment_page值可能是字符串),那么您可以添加#to_i调用:

comment_page = (instance_options.dig(:param_page, :comment_page).presence || 1).to_i
comment_per  = (instance_options.dig(:param_page, :comment_per).presence || 0).to_i

或使用reverse_merge(因为这是用于设置默认值):

param_page = instance_options[:param_page] || {}
param_page.reverse_merge(comment_page: 1, comment_per: 0)
# Then use param_page[:comment_page] and param_page[:comment_per] instead of two locals

推荐阅读