不幸的是我想不出一个写这个问题的好方法,我们有很多代码看起来像这样:
@annotation.note = params[:annotation][:note] if params[:annotation][:note]
@annotation.style = params[:annotation][:style] if params[:annotation][:style]
我发现如果最后的参数检查很烦人。
那么有没有一种方法可以更简洁地编写它,这样就可以理解,只有在存在的情况下才会复制该值,而不必在每次结束时都要求明确?
答案 0 :(得分:2)
x = params[:annotation][:note] and @annotation.note = x
x = params[:annotation][:style] and @annotation.style = x
答案 1 :(得分:1)
您可以轻松地将检查提取到方法中,以便您的代码更加干净。像这样,例如:
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
答案 2 :(得分:1)
你也可以试试这个:
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">
答案 3 :(得分:0)
params[:annotation][:note].tap{|v| @annotation.note = v if v}
params[:annotation][:style].tap{|v| @annotation.style = v if v}
答案 4 :(得分:0)
这是另一种方法:
@annotation.note = params[:annotation][:note] || @annotation.note
我承认,你重复@annotation.note
,但声明长度仍在减少。
答案 5 :(得分:-1)
这是另一次尝试:
@annotation.note = params[:annotation][:note] rescue nil
如果nil
不存在, @ annotation.note将保持params[:annotation][:note]
。