以下技术的优点和缺点是什么?
修改:以下技术之间有什么区别?**
我正在寻找与性能,灵活性,可读性等相关的差异。其中一些事情比其他事情更明显。
class Foo
def my_method(name)
case name
when "a"
"a"
when "b"
"12312"
when "c"
"blahblah"
when "d"
"---------"
when "e"
1
when "f"
:reference
end
end
end
vs
class Foo
MY_HASH = {
"a" => "a",
"b" => "12312",
"c" => "blahblah",
"d" => "-------",
"e" => 1,
"f" => :reference
}
def my_method(name)
MY_HASH[name]
end
end
答案 0 :(得分:5)
我会使用哈希常量。
除非有非常多的密钥,否则两种实现中的性能可能看起来相同。
但是,使用哈希常量,您可以随时访问常量,甚至可以在您编写的方法之外。您可以直接查看常量(甚至在类外部,即ClassName :: CONSTANT)以获取所有键和值。使用case语句,访问键和值将是..更棘手。
此外,与case语句相比,哈希可以轻松操作,甚至可以动态操作。如果您希望哈希值不可更改,只需将其冻结即可。
HASH_CONSTANT = {one: 1}.freeze
HASH_CONSTANT[:one] = 1
HASH_CONSTANT[:two] #=> RuntimeError: can't modify frozen Hash
案例情况的一个专家将返回一个新的数组或散列作为默认情况。与
HASH_CONSTANT = Hash.new([]).merge(populated_hash)
将使用散列中不存在的任何键返回相同的数组。
# :a and :b are non-existent keys
value_a = HASH_CONSTANT[:a] #=> []
value_a << 1
value_b = HASH_CONSTANT[:b] #=> [1]
然而,如果您将在案例中返回一个空数组&#34;否则&#34;条件,将返回一个新数组。这可能是有益的,具体取决于您的具体用途。
但话又说回来,你总能做到:
HASH_CONSTANT = populated_hash
HASH_CONSTANT[non_existent_key] || []
答案 1 :(得分:2)
从运行时性能的角度来看,switch语句将花费O(N)时间,而hash语句将花费O(1)时间。这是因为switch语句将强制运行时迭代列表中的每个选项,然后才能找到匹配的条件。除非你进行大量的查找,否则这可能不是一个非常重要的区别。
从安全角度来看,可能会通过覆盖现有条目来破坏哈希表。同样,哈希表允许在运行时映射新项目,从而提供更大的灵活性。
从清洁度的角度来看,如果要处理大量条目,使用哈希表会更清晰。一旦你通过了10,20,30个转换语句,事情就会开始变得非常粗糙。