2011-12-30 4 views
0

Я пытаюсь настроить массив со всеми значениями nil, чтобы кто-то мог повторять последовательность для каждого значения до тех пор, пока он не достигнет конца, а затем отобразит измененный массив.Как выполнить итерацию по массиву nils?

class Big 
    def ben 
    x = [nil,1,nil,2] 
    y = 0 
    x[y] == nil ? "good": "bad" 
    y += 1 
    puts x 
    end 
end 

Я знаю, что это может быть упрощена. Есть ли способ переписать каждое значение в массиве?

+3

Ваш код не заполнен. Пожалуйста, покажите, как вы вызываете метод «ben», и каков ожидаемый результат. Как есть, это выглядит очень надуманный пример, который ничего не делает. –

+0

Вы очень правы. Я забыл назвать метод, потому что он неполный.Извините, что не закончил код. Его следует назвать «Big.new.ben» - это то, что я называл. – Pete

ответ

1

Если я понять вас правильно, вы можете сделать это:

class Big 
    def ben 
    x = [nil,1,nil,2] 
    # These lines don't do much 
    # y = 0 
    # x[y] == nil ? "good": "bad" 
    # y += 1 
    puts x 
    end 
end 

И да на ваш второй вопрос: fill. Например:

[1, 2, 3].fill(0) # => [0, 0, 0] 
+0

Было бы хорошо объяснить, почему это нормально, чтобы прокомментировать промежуточные строки в методе 'ben'. ОП может не понимать, почему. –

1

Вот некоторые вещи, которые могут помочь, основываясь на том, что я вижу в примере кода.

Это простой способ создать массив, если вы хотите, чтобы быть определенным размером заполнен nil значений:

foo = [nil] * 5 
=> [nil, nil, nil, nil, nil] 

Если вы хотите, чтобы переплести два массива, такие как массив Nils и другой один со значениями:

TOTAL_ELEMENTS = 5 

([nil] * TOTAL_ELEMENTS).zip((1..TOTAL_ELEMENTS).to_a).flatten 
=> [nil, 1, nil, 2, nil, 3, nil, 4, nil, 5] 

на основе ФОС комментарий ниже, что это за крестики-нолики игры, вот несколько способов создания x:

Array.new(9) 
[nil] * 9 

Оба возвращающие:

=> [nil, nil, nil, nil, nil, nil, nil, nil, nil] 

Это полезно, если вы получаете ячейку координат как смещение от 0

Для крестики-нолики сетки может быть более полезно иметь три ряда из трех столбцов, если вы получите ваши координаты ячейки как пары строк/столбцов:

Array.new(3) { Array.new(3) } 
[[nil] * 3] * 3 

Возвращение:

=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 

И некоторые вещи, чтобы медитировать на:

ROWS = COLUMNS = 3 

x = Array.new(ROWS * COLUMNS)   # for offsets 
x = Array.new(ROWS) { Array.new(COLUMNS) } # for rows and columns 

Если вы получаете свою позицию, как смещение, но хотите, чтобы преобразовать его в строке/столбце, использование divmod. Ваше смещение будет 0..8, преобразуется в сетку 3x3, , т. Е. [0..2][0..2]. Преобразование обратно слишком легко:

def row_col_to_offset(x,y) 
    x * ROW + y 
end 
>> row_col_to_offset(0,0) # => 0 
>> row_col_to_offset(0,1) # => 1 
>> row_col_to_offset(1,1) # => 4 
>> row_col_to_offset(2,2) # => 8 

def offset_to_row_col(o) 
    o.divmod(ROW) 
end 
>> offset_to_row_col(0) # => [0, 0] 
>> offset_to_row_col(1) # => [0, 1] 
>> offset_to_row_col(4) # => [1, 1] 
>> offset_to_row_col(8) # => [2, 2] 

Теперь вы должны узнать о @ переменных экземпляра Руби, и правильное использование метода initialize.

+0

Я нахожу '[nil] * 5', своеобразный способ сделать' Array.new (5) ', но результат тот же ... – Mischa

+0

Возможно, я немного не понял, к чему я хотел попасть. Я делаю tictactoe, в котором пользователь будет выбирать число из массива 0..8 'x = [nil, nil, nil]', тогда пользователь 1 выбирает 0 'x = [nil," X ", nil]' then user 2 выбирает 2 'x = [nil," x "," O "]' – Pete

+0

Вам нужно использовать один массив из девяти элементов или вы можете использовать три массива из трех элементов, то есть 'x [0 .. 2] [0..2] '? –

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