Ruby 中的多个条件语句执行
Multiple Conditional Statement Execution in Ruby
以下语句如果内容不为nil则需要评估并提交。接收端不接受nil值。
:customer => {
if !@transaction.name.nil? :first_name => @transaction.nome,
if !@transaction.last_name.nil? :last_name => @transaction.last_name,
if !@transaction.nation_id.nil? :country_name => @transaction.nation.name
},
没有条件,一个简单的语句 :first_name => @transaction.nome,
被正确评估,并且带有方括号和逗号的语法是正确的。但是,条件的引入会在 nil 值的情况下创建空白并生成 语法错误 unexpected '}'
.
如何克服这个问题?
一种方法是构建散列:
h = {}
if @transaction.name !=nil then h[:first_name] = @transaction.name end
if @transaction.last_name !=nil then h[:last_name] = @transaction.last_name end
if @transaction.nation_id !=nil then h[:country_name] = @transaction.nation.name end
:customer => h
如果你知道你的项目总是真实的或零,从不虚假,那么这更短:
if @transaction.name then h[:first_name] = @transaction.name end
if @transaction.last_name then h[:last_name] = @transaction.last_name end
if @transaction.nation_id then h[:country_name] = @transaction.nation.name end
您可以简单地添加值,然后过滤掉它们。将使您免于所有这些检查:
:customer => {
:first_name => @transaction.nome,
:last_name => @transaction.last_name,
:country_name => @transaction.nation.try(:name)
}.reject{ |_, v| v.nil? }
你可以通过添加一个小的 lambda 来消除一些重复
customer: {}.tap { |h|
conditional_store = -> key, value { h.store(key, value) unless value.nil? }
conditional_store[:firstName, @transaction.name]
conditional_store[:last_name, @transaction.last_name]
conditional_store[:country_name, @transaction.nation.name]
}
以下语句如果内容不为nil则需要评估并提交。接收端不接受nil值。
:customer => {
if !@transaction.name.nil? :first_name => @transaction.nome,
if !@transaction.last_name.nil? :last_name => @transaction.last_name,
if !@transaction.nation_id.nil? :country_name => @transaction.nation.name
},
没有条件,一个简单的语句 :first_name => @transaction.nome,
被正确评估,并且带有方括号和逗号的语法是正确的。但是,条件的引入会在 nil 值的情况下创建空白并生成 语法错误 unexpected '}'
.
如何克服这个问题?
一种方法是构建散列:
h = {}
if @transaction.name !=nil then h[:first_name] = @transaction.name end
if @transaction.last_name !=nil then h[:last_name] = @transaction.last_name end
if @transaction.nation_id !=nil then h[:country_name] = @transaction.nation.name end
:customer => h
如果你知道你的项目总是真实的或零,从不虚假,那么这更短:
if @transaction.name then h[:first_name] = @transaction.name end
if @transaction.last_name then h[:last_name] = @transaction.last_name end
if @transaction.nation_id then h[:country_name] = @transaction.nation.name end
您可以简单地添加值,然后过滤掉它们。将使您免于所有这些检查:
:customer => {
:first_name => @transaction.nome,
:last_name => @transaction.last_name,
:country_name => @transaction.nation.try(:name)
}.reject{ |_, v| v.nil? }
你可以通过添加一个小的 lambda 来消除一些重复
customer: {}.tap { |h|
conditional_store = -> key, value { h.store(key, value) unless value.nil? }
conditional_store[:firstName, @transaction.name]
conditional_store[:last_name, @transaction.last_name]
conditional_store[:country_name, @transaction.nation.name]
}