以下技术的优点和缺点是什么?
编辑:以下技术之间有什么区别?**
我正在寻找与性能,灵活性,可读性等相关的差异.其中一些事情比其他事情更明显.
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我会使用哈希常量.
除非有非常多的密钥,否则两种实现中的性能可能看起来都相同.
但是,使用哈希常量,您可以随时访问常量,甚至可以在您编写的方法之外.您可以直接查看常量(甚至在类外部,即ClassName :: CONSTANT)以获取所有键和值.使用case语句,访问键和值将是..更棘手.
此外,与case语句相比,哈希可以很容易地操作,甚至是动态的.如果您希望散列不可更改,只需将其冻结即可.
HASH_CONSTANT = {one: 1}.freeze
HASH_CONSTANT[:one] = 1
HASH_CONSTANT[:two] #=> RuntimeError: can't modify frozen Hash
Run Code Online (Sandbox Code Playgroud)
案例情况的一个专家将返回一个新的数组或散列作为默认情况.同
HASH_CONSTANT = Hash.new([]).merge(populated_hash)
Run Code Online (Sandbox Code Playgroud)
将使用散列中不存在的任何键返回相同的数组.
# :a and :b are non-existent keys
value_a = HASH_CONSTANT[:a] #=> []
value_a << 1
value_b = HASH_CONSTANT[:b] #=> [1]
Run Code Online (Sandbox Code Playgroud)
但是,当您在case的"else"条件下返回一个空数组时,将返回一个新数组.这可能是有益的,具体取决于您的具体用途.
但话说回来,你总能做到:
HASH_CONSTANT = populated_hash
HASH_CONSTANT[non_existent_key] || []
Run Code Online (Sandbox Code Playgroud)