読者です 読者をやめる 読者になる 読者になる

Ruby の Hash で値だけ map で変換したかった

hash = {a: 1, b: 2, c: 3}
hash2 = hash.map {|k, v| [k, v * 2] }.to_h
p hash2  # => {a: 2, b: 4, c: 6}

めんどくさい。Scala には mapValues というのがあるらしい。

Ruby で書くならこうかな。

class Hash
  def map_values(&block)
    dup.map_values!(&block)
  end

  def map_values!(&block)
    update(self) {|_, v| block.call(v) }
  end
end


hash = {a: 1, b: 2, c: 3}
hash2 = hash.map_values {|v| v * 2 }
p hash2  # => {a: 2, b: 4, c: 6}

ググる似たようなはちらほらあるっぽい。Ruby にも標準で欲しかった。