Добавление ключа только в хеш на основе оператора if - PullRequest
2 голосов
/ 29 августа 2010

Как правило, мы определяем хеш как

h={:a=>val1, :b=>val2}

Однако я хочу добавить условие, чтобы добавить только в ключ: b, если val2 не является нулевым значением.Что-то вроде

h={:a=>val1}
h[:b]=val2 if val2

Но может ли оно быть заключено в одну строку?

Ответы [ 5 ]

3 голосов
/ 29 августа 2010

Вам не нужно беспокоиться о нуле элементов в хэше, потому что вы можете просто очистить их от хэша:

{:a => 1, :b => nil}.reject { |k, v| v.nil? } # {:a => 1}
3 голосов
/ 29 августа 2010
h = { :a => val1 }.merge(val2 ? { :b => val2 } : {})

Но не делай этого. Просто будь проще.

2 голосов
/ 29 августа 2010
h[:b] = val unless val.nil?
1 голос
/ 29 сентября 2017

с ruby ​​2.4, вы можете использовать Hash # compact

h = { a: 1, b: false, c: nil }
h.compact     #=> { a: 1, b: false }
h             #=> { a: 1, b: false, c: nil }
1 голос
/ 29 августа 2010

Вы можете переопределить оператор [] = только для этого одного хэша или создать подкласс Hash и переопределить его там.

hash = {}

class << hash
  def []=(key, value)
    case key
    when :b
      raise StandardError("Invalid :b value") if value.nil?
    end

    super(key,value)
  end
end

hash[:a] = 10
hash[:b] = nil  # Will raise exception
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...