在Ruby中使用||=
现在,我使用以下命令来确保我的所有参数值都不是nil在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' 但是我得到了错误
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
为什么在一条线上完成这一切很重要?只是因为?编写可维护和可读的代码,以便编写可维护和可读代码的其他人能够一目了然地理解它。为什么在一行中完成所有工作很重要?只是因为?编写可维护和可读的代码,以便编写可维护和可读代码的其他人能够一目了然地理解它。