案例陈述与Ruby中的哈希查找的优缺点是什么?

meh*_*kar 2 ruby

以下技术的优点和缺点是什么?

编辑:以下技术之间有什么区别?**

我正在寻找与性能,灵活性,可读性等相关的差异.其中一些事情比其他事情更明显.

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)

SHS*_*SHS 5

我会使用哈希常量.

除非有非常多的密钥,否则两种实现中的性能可能看起来都相同.

但是,使用哈希常量,您可以随时访问常量,甚至可以在您编写的方法之外.您可以直接查看常量(甚至在类外部,即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)