2011-12-08 2 views
0

Я использую Ruby, и есть хэш, назовем его foo, и его значение является массив с фиксированной длиной 2.Как обновить массив хэш-значения?

Как я могу обновить один из индексов в пределах массива хэш-значения? Вот пример:

foo.each do |k, v| 
    if k == 'some value' 
    foo[k] = update v[0] 
    foo[k] = update v[1] 
    end 
end 

Дальнейшее уточнение:

Я перекручивание через файл и внутри я хочу, чтобы увидеть, если текущая строка соответствует хэш ключа k. Если это так, я хочу обновить временную метку в массиве значений, который хранится в v[1].

# read lines from the input file 
File.open(@regfile, 'r') do |file| 
    file.each_line do |line| 
    # cache control 
    cached = false 

    # loop through @cache 
    @cache.each do |k, v| 
     # if (url is cached) 
     if line == k 
     # update the timestamp 
     @cache[k] = Time.now.getutc # need this to be put in v[1] 

     # set cached to true 
     cached = true 
     end 
    end 

    # if cached go to next line 
    next if cached 

    # otherwise add to cache 
    updateCache(line) 
    end 
end 
+0

почему не просто установить Foo [к] [0] = new_value; foo [k] [1] = new_value2 – klochner

+2

Покажите пример ввода/ожидаемого вывода, чтобы мы могли лучше понять ваш вопрос. –

+0

@klochner я собирался попробовать это, но я не был уверен, что если ввести foo [k] [1], обновит вторую позицию в массиве v. – CoryDorning

ответ

3
# cache control 
cached = false 

# loop through @cache 
@cache.each do |k, v| 
    # if (url is cached) 
    if line == k 
    # update the timestamp 
    @cache[k] = Time.now.getutc # need this to be put in v[1] 

    # set cached to true 
    cached = true 
    end 
end 

# if cached go to next line 
next if cached 

# otherwise add to cache 
updateCache(line) 

А лучше и быстрее решение:

if @cache.include? line 
    @cache[line][1] = Time.now.utc 
else 
    updateCache(line) 
end 
+1

'cached = true' =>' else updateCache (строка) end' и 'cached' не требуется –

+0

@VictorMoroz: Спасибо. Я обновил ответ. –

2
foo = { 'v1' => [1, 2], 'v2' => [3, 4] } 

foo.each do |k, v| 
    v[0] += 10 
    v[1] += 10 
end 

p foo # {"v1"=>[11, 12], "v2"=>[13, 14]} 
+0

Я думаю, что это то, что я хочу. пытаясь сейчас. – CoryDorning

+0

это, кажется, не обновляет массив хэш-ключей. – CoryDorning

Смежные вопросы