1

如何处理 case 语句中的大量条件?
...我要写一个案例陈述,大约有 125 个什么时候。

这与我现在正在做的事情一致,基于我将节点添加到 Nokogiri XML 文档时的每一次,每一次在设置命名空间之前在节点中设置两个值:

case var
when :string
 property_uom_node = Nokogiri::XML::Node.new "test_value", @ixml.doc
    property_uom_node['att'] = "val"
    property_uom_node.namespace = @ixml.doc.root.namespace_definitions.find{|ns| ns.prefix=="dt"}
    property_uom_node
when :integer
 #do something else
when :blue
...
#100 more when statements
...
end

我不是在寻找特定领域的建议,只要有一种干净的方法可以做到这一点,而不会以 300 行方法结束。

这就是我最终做的事情:

lookup = {:lup => ["1","2"], :wup => ["1","2"]}

case param
when lookup.has_key?(param)
  property_uom_node = Nokogiri::XML::Node.new "#{lookup[param][0]}", @ixml.doc
        property_uom_node['att'] = #{lookup[param][1]}
        property_uom_node.namespace = @ixml.doc.root.namespace_definitions.find{|ns| ns.prefix=="dt"}
        property_uom_node
end
4

2 回答 2

3

许多 case 语句可以并且许多应该被其他结构替换。基本上,这个想法是将策略——你希望代码做什么——与实现——代码如何做分开。

假设您的 case 语句以一个符号为键(也就是说,每个 then when子句都是一个常量符号):

case foo
when :one
  puts 1  
when :two
  puts 2
when :three
  puts 3
else
  puts 'more'
end

这可以大部分替换为数据结构:

INTS = {:one => 1, :two => 2}
key = :one
puts INTS[key]    # => 1

如果有两个不同的值,而不仅仅是一个呢?然后让每个值都有自己的哈希值:

DOGS = {
  :dog1 => {:name => 'Fido', :color => 'white},
  :dog2 => {:name => 'Spot', :color => 'black spots'},
}
key = :dog2
dog = DOGS[key]
puts "#{dog[:name]}'s color is #{dog[:color]}"
# => "Spot's color is black spots"
于 2013-05-16T02:20:58.407 回答
3

看起来第二个案例语句只有一个案例。哈希是进行查找的好方法(很多情况下)。你可以这样尝试:

if val = lookup[param]
  property_uom_node = Nokogiri::XML::Node.new(val[0], @ixml.doc)
  property_uom_node['att'] = val[1]
  property_uom_node.namespace = @ixml.doc.root.namespace_definitions.find{ |ns| ns.prefix == "dt" }
  property_uom_node # return the node
else
  # not one of our cases
end
于 2013-05-16T04:29:33.750 回答