Ruby - как добавить условный ключ к ha sh? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть этот метод создания ha sh:

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

Ответы [ 4 ]

2 голосов
/ 03 августа 2020

Не самое красивое решение, но можно было бы использовать **:

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

Обратите внимание, что == true можно не указывать, если вам просто важно, является ли @var правдой .

1 голос
/ 03 августа 2020

Может быть, вы можете рассмотреть что-то вроде отклонение ключа, если нет @var:

def build_values(data)
  {
    key1: data.k1,
    key2: data.k2,
    key3: data.k3,
    key4: data.k4
    }.reject{ |k, _| k == :key3 && !@var }
end
0 голосов
/ 03 августа 2020
def build_values(data)
  hash = {
    key1: data.k1,
    key2: data.k2,
    key4: data.k4,
    ...
  }
  hash[:key3] = data.k3 if @var == true  
end
0 голосов
/ 03 августа 2020

Если вы заботитесь о порядке ключей, вы можете сделать:

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

Однако, если вы здесь, возможно, стоит подумать о настраиваемом классе - либо Struct, либо даже подклассе Ha sh для работы с этими данными.

...