使用|| =在Ruby中的一行上分配多个值

时间:2014-05-23 22:33:44

标签: ruby

现在我使用以下内容确保我的所有参数值都不是

start, limit = params[:start] ||= 0, params[:limit] ||= 300
sort, dir = params[:sort] ||= 'id', params[:dir] ||= 'ASC'

但我想使用像

这样的东西
params[:start], params[:limit] ||= 0, 300
params[:sort], params[:dir] ||= 'id', 'ASC'

但我收到错误语法错误,意外的tOP_ASGN,期待' ='

有人有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

怎么样:

params = {start: 0, limit: 300, sort: 'id', dir: 'ASC'}.merge(params)

更新

如果params没有指定的密钥,则上述代码将有效,但是,例如params[:key]存在且关联值为nil,结果为nil。要解决这个问题,你可以这样做:

params = {start: 0, limit: 300, sort: 'id', dir: 'ASC'}.merge(params) {|_,old,new| new || old }

答案 1 :(得分:1)

编写代码如下:

start, limit = params[:start] ||= 0, params[:limit] ||= 300
sort, dir = params[:sort] ||= 'id', params[:dir] ||= 'ASC'

或:

params[:start], params[:limit] ||= 0, 300
params[:sort], params[:dir] ||= 'id', 'ASC'

看似可取,因为它“紧凑”,“简洁”或“简洁”,它转向迎面而来的车道,变得难以理解。

分散逻辑是可以的,因为我们的目标是让那些可能必须在周六晚上3:00维护它的人理解我们的代码。

而不是上述内容,我将它分开:

start = params[:start] ||= 0     # explain why 0
limit = params[:limit] ||= 300   # explain why 300
sort  = params[:sort]  ||= 'id'  # explain why 'id'
dir   = params[:dir]   ||= 'ASC' # explain why 'ASC'

或:

start, limit, sort, dir = params.values_at(:start, :limit, :sort, :dir)
start ||= 0     # explain why 0
limit ||= 300   # explain why 300
sort  ||= 'id'  # explain why 'id'
dir   ||= 'ASC' # explain why 'ASC'

在上述任何一种情况下,我都会更进一步定义使用符号名称的常量,而不是硬编码的“魔术”值。

可能获得一个毫秒的执行速度来编写你想要的代码,如果你可以让它工作,但是你可能会损失数秒或几分钟的维护时间,并且使用你的代码激怒同事或其他人,因为它不是正常的,标准的或预期的,所以不要去那里。

答案 2 :(得分:0)

我最终这样做了,这对我来说简洁易懂。 我需要将params作为一个整体传递,因为我可能还需要其他值来构建我的选择。 变量名称不言而喻,它们最终可能会出现在yaml配置文件中,并提供所需的解释。

  def generic_data_getter (class_name, params, start=0, limit=300, sort='id', dir='ASC')
    selection = build_selection(class_name, params)
    data = class_name.where(selection).offset(start).limit(limit).order("#{sort} #{dir}")
    {:success => true, :totalCount => data.except(:offset, :limit, :order).count, :result => data.to_hash}
  end

  def get_data_for (class_name, params)
    generic_data_getter(class_name, params, params[:start], params[:limit], params[:sort], params[:dir])
  end