[英]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.