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

时间:2012-11-28 10:23:09

标签: ruby

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

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

我发现如果最后的参数检查很烦人。

那么有没有一种方法可以更简洁地编写它,这样就可以理解,只有在存在的情况下才会复制该值,而不必在每次结束时都要求明确?

6 个答案:

答案 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]