gpt4 book ai didi

ruby - 在 Ruby 中处理 100 多个条件的最佳方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 17:24:37 25 4
gpt4 key购买 nike

如何处理 case 语句中的大量条件?
...我要写一个大约 125 when's 的案例陈述。

这与我现在正在做的事情一致,基于每次将节点添加到 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

最佳答案

许多 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"

关于ruby - 在 Ruby 中处理 100 多个条件的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16577713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com