繁体   English   中英

如果您分配的值存在,如何在不检查每个步骤的情况下在 ruby​​ 中分配

[英]how to assign in ruby without checking each step if the values you assign exist

不幸的是,我想不出一个很好的方法来写这个问题,我们有很多代码最终看起来像这样:

@annotation.note = params[:annotation][:note] if params[:annotation][:note]
@annotation.style = params[:annotation][:style] if params[:annotation][:style]

我发现 if params 最后检查很烦人。

那么有没有办法更简洁地写这个,以便理解该值只有在它存在时才会被复制,而不必每次都明确询问是否在最后?

x = params[:annotation][:note] and @annotation.note = x
x = params[:annotation][:style] and @annotation.style = x

您可以轻松地将检查提取到一个方法中,以便您的代码更加 DRY。 像这样,例如:

def copy obj, prop, params
  val = params[prop]
  obj.send "#{prop}=", val if val
end

ann = params[:annotation]
copy @annotation, :node, ann
copy @annotation, :style, ann

你也可以试试这个:

params[:annotation].each_pair {|k,v| v && @annotation.send("#{k}=", v) }

一些测试:

require 'ostruct'

@annotation = OpenStruct.new
params = {:annotation => {:note => 'note', :style => 'style'}}

params[:annotation].each_pair {|k,v| v && @annotation.send("#{k}=", v) }

p @annotation
#<OpenStruct note="note", style="style">

@annotation = OpenStruct.new
params = {:annotation => {:note => nil, :style => 'style'}}

params[:annotation].each_pair {|k,v| v && @annotation.send("#{k}=", v) }

p @annotation
#<OpenStruct style="style">

@annotation = OpenStruct.new
params = {:annotation => {:note => 'note'}}

params[:annotation].each_pair {|k,v| v && @annotation.send("#{k}=", v) }

p @annotation
#<OpenStruct note="note">
params[:annotation][:note].tap{|v| @annotation.note = v if v} 
params[:annotation][:style].tap{|v| @annotation.style = v if v}

这里还有另一种方法:

@annotation.note = params[:annotation][:note] || @annotation.note

我承认,您确实重复了@annotation.note但语句长度仍然减少了。

这是另一个尝试:

@annotation.note = params[:annotation][:note] rescue nil

如果params[:annotation][:note]不存在,@annotation.note 将保持nil

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM