Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中使用||=_Ruby - Fatal编程技术网

在Ruby中使用||=

在Ruby中使用||=,ruby,Ruby,现在,我使用以下命令来确保我的所有参数值都不是nil 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' 但是我得到了错误

现在,我使用以下命令来确保我的所有参数值都不是nil

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\u ASGN,预期为'='

有人有更好的方法吗?

怎么样:

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 }
那么:

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 }

在编写代码时,如:

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

可能因为它“紧凑”、“简洁”或“简洁”而令人满意,它转向迎面而来的车道,变得无法阅读

扩展逻辑是可以的,因为目标是让那些可能不得不在周六凌晨3点维护代码的人能够理解我们的代码

我要把它拆开,而不是上面的内容:

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 = params[:start] ||= 0, params[:limit] ||= 300
sort, dir = params[:sort] ||= 'id', params[:dir] ||= 'ASC'
或:

可能因为它“紧凑”、“简洁”或“简洁”而令人满意,它转向迎面而来的车道,变得无法阅读

扩展逻辑是可以的,因为目标是让那些可能不得不在周六凌晨3点维护代码的人能够理解我们的代码

我要把它拆开,而不是上面的内容:

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'
或:

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


如果你能让代码正常工作,你可能会获得一毫秒的执行速度,但你可能会损失几秒或几分钟的维护时间,并会因为代码不正常、不标准或不符合预期而激怒同事或其他人,所以不要去那里。

我最后就是这样做的,这对我来说是简明易懂的。 我需要将参数作为一个整体传递,因为可能还有其他值需要构建我的选择。 变量名本身就说明了问题,它们可能最终会出现在一个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

最后我就这样做了,简洁易懂。 我需要将参数作为一个整体传递,因为可能还有其他值需要构建我的选择。 变量名本身就说明了问题,它们可能最终会出现在一个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

为什么在一条线上完成这一切很重要?只是因为?编写可维护和可读的代码,以便编写可维护和可读代码的其他人能够一目了然地理解它。为什么在一行中完成所有工作很重要?只是因为?编写可维护和可读的代码,以便编写可维护和可读代码的其他人能够一目了然地理解它。