Ruby에서 해시의 모든 값 변경
해시의 모든 값을 변경하여 값 앞과 뒤에 '%'를 추가하고 싶습니다.
{ :a=>'a' , :b=>'b' }
로 변경해야 합니다.
{ :a=>'%a%' , :b=>'%b%' }
이것을 하는 가장 좋은 방법은 무엇입니까?
Ruby 2.1 이상에서 할 수 있습니다.
{ a: 'a', b: 'b' }.map { |k, str| [k, "%#{str}%"] }.to_h
실제 문자열 자체가 제자리에서 변이되기를 원하는 경우(같은 문자열 개체에 대한 다른 참조에 영향을 미칠 수 있으며 가급적이면):
# Two ways to achieve the same result (any Ruby version)
my_hash.each{ |_,str| str.gsub! /^|$/, '%' }
my_hash.each{ |_,str| str.replace "%#{str}%" }
해시가 제자리에서 변경되지만 문자열에 영향을 미치지 않으려면(새 문자열을 가져오려면):
# Two ways to achieve the same result (any Ruby version)
my_hash.each{ |key,str| my_hash[key] = "%#{str}%" }
my_hash.inject(my_hash){ |h,(k,str)| h[k]="%#{str}%"; h }
새 해시를 원하는 경우:
# Ruby 1.8.6+
new_hash = Hash[*my_hash.map{|k,str| [k,"%#{str}%"] }.flatten]
# Ruby 1.8.7+
new_hash = Hash[my_hash.map{|k,str| [k,"%#{str}%"] } ]
루비 2.4는 당신이 사용할 수 있는 방법을 소개했습니다.
{ :a=>'a' , :b=>'b' }.transform_values! { |v| "%#{v}%" }
# => {:a=>"%a%", :b=>"%b%"}
해시 값을 수정하는 가장 좋은 방법은 다음과 같습니다.
hash.update(hash){ |_,v| "%#{v}%" }
코드가 적고 명확한 의도가 있습니다.또한 변경해야 하는 값을 초과하는 새 개체가 할당되지 않기 때문에 더 빠릅니다.
조금 더 읽기 쉬운 것,map
그것은 일련의 단 하나의 해시와.reduce
그것과 함께merge
the_hash.map{ |key,value| {key => "%#{value}%"} }.reduce(:merge)
이 작업을 위한 새로운 'Railway' 방법이 있습니다 :) http://api.rubyonrails.org/classes/Hash.html#method-i-transform_values
원본에 부작용을 도입하지 않는 한 가지 방법:
h = {:a => 'a', :b => 'b'}
h2 = Hash[h.map {|k,v| [k, '%' + v + '%']}]
Hash#map은 또한 흥미로운 읽을거리가 될 수 있습니다. 그것은 왜 그것이Hash.map
해시를 반환하지 않습니다(그래서 결과 배열이[key,value]
쌍은 새 해시로 변환되며 동일한 일반 패턴에 대한 대안적인 접근 방식을 제공합니다.
해피 코딩.
[거부자:나는 확신할 수 없습니다.Hash.map
Ruby 2.x의 의미 변경]
my_hash.each do |key, value|
my_hash[key] = "%#{value}%"
end
Hash.merge!가 가장 깨끗한 솔루션입니다.
o = { a: 'a', b: 'b' }
o.merge!(o) { |key, value| "%#{ value }%" }
puts o.inspect
> { :a => "%a%", :b => "%b%" }
다음과 같이 RSpec로 테스트한 후:
describe Hash do
describe :map_values do
it 'should map the values' do
expect({:a => 2, :b => 3}.map_values { |x| x ** 2 }).to eq({:a => 4, :b => 9})
end
end
end
다음과 같이 Hash#map_values를 구현할 수 있습니다.
class Hash
def map_values
Hash[map { |k, v| [k, yield(v)] }]
end
end
이 기능은 다음과 같이 사용할 수 있습니다.
{:a=>'a' , :b=>'b'}.map_values { |v| "%#{v}%" }
# {:a=>"%a%", :b=>"%b%"}
어떤 인플레이스 모델이 가장 빠른지 궁금하다면 다음과 같습니다.
Calculating -------------------------------------
inplace transform_values! 1.265k (± 0.7%) i/s - 6.426k in 5.080305s
inplace update 1.300k (± 2.7%) i/s - 6.579k in 5.065925s
inplace map reduce 281.367 (± 1.1%) i/s - 1.431k in 5.086477s
inplace merge! 1.305k (± 0.4%) i/s - 6.630k in 5.080751s
inplace each 1.073k (± 0.7%) i/s - 5.457k in 5.084044s
inplace inject 697.178 (± 0.9%) i/s - 3.519k in 5.047857s
언급URL : https://stackoverflow.com/questions/5189161/changing-every-value-in-a-hash-in-ruby
'programing' 카테고리의 다른 글
dplyr::filter에서 문자열을 변수 이름으로 전달 (0) | 2023.06.15 |
---|---|
포인터(주소)가 음수가 될 수 있습니까? (0) | 2023.06.15 |
Wordpress 블록 테마에 사용자 지정 블록 추가(플러그인을 사용하지 않음) (0) | 2023.06.15 |
셀 값을 기준으로 행을 삭제하는 방법 (0) | 2023.06.10 |
스토리보드의 표 머리글 보기 (0) | 2023.06.10 |