Ruby - 如何向散列添加条件键?

Ruby - how to add a conditional key to a hash?

我用这个方法创建哈希:

def build_values(data)
  {
    key1: data.k1,
    key2: data.k2,
    key3: (@var == true ? data.k3 : nil),
    key4: data.k4,
    ...
  }
end

如果 @var == true,则 key3 的值为 data.k2。不错。

如果不是true,那么key3就没有值(实际上是nil)。但理想情况下,我根本不想打印 key3

我该怎么做?这样的事情不起作用:

def build_values(data)
  {
    key1: data.k1,
    key2: data.k2,
    if @var == true
      key3: data.k3
    end,
    key4: data.k4,
    ...
  }
end

如果你关心键的顺序,你可以这样做:

def build_values(data)
  data = {
    key1: data.k1,
    key2: data.k2
  }
  data[:key3] = data.k3 if @var == true
  data.merge(
    key4: data.k4,
    ...
  }
end

或者,您可以使用预定义的键顺序(当有更多可选键时可以使用):

KEY_ORDER = %i[key1 key2 key3 key4 ...]

def build_values(data)
  data = {
    key1: data.k1,
    key2: data.k2,
    key4: data.k4
  }
  data[:key3] = data.k3 if @var == true
  data.sort_by { |k, _| KEY_ORDER.index(k) }.to_h 
end

但是,如果您来到这里,可能值得考虑自定义 class - Struct 甚至 Hash subclass 来处理这些数据。

如果不是@var:

,也许你可以考虑像rejecting这样的关键
def build_values(data)
  {
    key1: data.k1,
    key2: data.k2,
    key3: data.k3,
    key4: data.k4
    }.reject{ |k, _| k == :key3 && !@var }
end

不是最漂亮的解决方案,但可以使用 **

{
  key1: data.k1,
  key2: data.k2,
  **(@var == true ? { key3: data.k3 } : {}),
  key4: data.k4,
}

注意如果你只关心@var是否真实.

可以省略== true
def build_values(data)
  hash = {
    key1: data.k1,
    key2: data.k2,
    key4: data.k4,
    ...
  }
  hash[:key3] = data.k3 if @var == true  
end