簡體   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