2016-11-27 7 views
0

私は例えば、ハッシュを経由して、配列の値を変更したい:配列内の値をハッシュで変更するにはどうすればいいですか?

arr = ['g','g','e','z'] 
positions = {1 => arr[0], 2 => arr[1]} 

positions[1] = "ee" 

問題は変わっ1のハッシュと配列でないということです。私がするときp arrそれはまだ['g','g','e','z']を出力します。これを回避する方法はありますか?

+0

正確に達成したいことはありますか? –

+0

@MarkoAvlijašタイトルの中で。私はハッシュを介して配列を変更したい。しかし、私がそれをすると、変更されるのはハッシュ自体であり、配列ではありません – chaosfirebit

+0

@chaosfirebitそしてなぜそれをしたいのですか? – Stefan

答えて

2

は、あなたがやりたいようにコードの別の行を追加する必要があるとしている:

arr = ['g','g','e','z'] 
positions = {1 => arr[0], 2 => arr[1]} 

positions[1] = "ee" 
arr[0] = positions[1] 

別のオプションは、このような自動的にあなたのための配列を更新する方法、何かをするために次のようになります。

def update_hash_and_array(hash, array, val, index) 
    # Assume that index is not zero indexed like you have 
    hash[index] = val 
    array[index - 1] = val 
end 

update_hash_and_array(positions, arr, "ee", 1) # Does what you want 
2

これは、procsを使用してハッシュにコード化することができます。

arr = ['g','g','e','z'] 

positions = {1 => -> (val) { arr[0] = val } } 


positions[1].('hello') 
# arr => ['hello', 'g', 'e', 'z'] 

任意の配列を変更できるハッシュを生成する場合は、これを少し一般化できます。

def remap_arr(arr, idx) 
    (idx...arr.length+idx).zip(arr.map.with_index{|_,i| -> (val) {arr[i] = val}}).to_h 
end 

arr = [1,2,3,4,5,6] 
positions = remap_arr(arr, 1) 

positions[2].('hello') 
# arr => [1,'hello',3,4,5,6] 

positions[6].('goodbye') 
# arr => [1,'hello',3,4,5,'goodbye'] 

しかし、私は、配列のインデックスの動作は、このようなケースでは1ではなく0から開始するように動作する方法を変更する理由はない、これは単なる思考実験で望んでいる、あなたは通常、ちょうど相殺したいと思います適切な配列のインデックスに一致するインデックス(ゼロから始まる)。十分でない場合は、別のデータ構造が必要なサインです。

+0

これは本当に面白いです。私はこれが存在するかどうか分からなかった。 –

+0

@ gr1zzlybe4r heh、それは本当に私が知っている限り、それは一般的なルビーのパラダイムではない...それははるかにjavascript - yです。私が言ったように、実際にこの種のことを行う本当の理由はなく、さらにメソッドを書くだけでも(あなたの答えのように)はるかに明確になります。 – Damon

1
#!/usr/bin/env ruby 

a = %w(q w e) 

h = { 
    1 => a[0] 
} 

puts a[0].object_id # 70114787518660 
puts h[1].object_id # 70114787518660 
puts a[0] === h[1] # true 

# It is a NEW object of a string. Look at their object_ids. 
# That why you can not change value in an array via a hash. 
h[1] = 'Z' 

puts a[0].object_id # 70114787518660 
puts h[1].object_id # 70114574058580 
puts a[0] === h[1] # false 

h[2] = a 

puts a.object_id # 70308472111520 
puts h[2].object_id # 70308472111520 
puts h[2] === a  # true 

puts a[0] === h[2][0] # true 
# Here we can change value in the array via the hash. 
# Why? 
# Because 'h[2]' and 'a' are associated with the same object '%w(q w e)'. 
# We will change the VALUE without creating a new object. 
h[2][0] = 'X' 

puts a[0]    # X 
puts h[2][0]   # X 
puts a[0] === h[2][0] # true 
関連する問題