2015-11-24 3 views
1

Как бы написать этот код Java в Ruby:перевести Java 2D массив в рубин

String[] [] Score = new String [row] [col]; 
Score[rCount][cCount] = num; 

Я думал, что это будет так просто, как:

score=[] 
score[rcount][ccount]=num 

Но я получаю «неопределенный метод` [ ] = 'для nil: NilClass (NoMethodError) "

+1

Пожалуйста, прочтите http://stackoverflow.com/help/how-to-ask и создайте [MCVE] (http://stackoverflow.com/help/mcve), а затем спросите. Люди здесь пытаются помочь вам. Самое меньшее, что вы могли бы сделать, это форматировать вопрос, чтобы его было более читаемым. Зачем вам нужен тег java? – StackFlowed

+1

Вы можете улучшить свой вопрос, удалив ссылку на Java. Просто спросите, например, как вы можете создать массив 'arr', который позволяет' arr [row] [col] = 3' установить значение и 'arr [row] [col]', чтобы вернуть значение. –

ответ

1

Во-первых, программисты Ruby используют футляр для змей. Заглавная буква используется для имен классов.

Во-вторых, ваша проблема происходит только потому, что

score[rcount] == nil # true 

Если вы хотите, чтобы иметь доступ ко второму элементам измерения, Вам нужно инициализировать строку как массив:

score[rcount] = [] 

Теперь вы можете установить второе измерение элемент

score[rcount][ccount] = num 
3

Извините, я не знаю java, но взгляните на класс meth ods Array#new и Array::[], а также методы экземпляра Array#[]= и Array#[]. Вот некоторые примеры, которые должны ответить на ваш вопрос (и другие вопросы, которые могут быть спровоцированные, надеюсь):

Array.new #=> [] 
[]  #=> [] # shorthand for above 

a = Array.new(5) { [] } #=> [[], [], [], [], []] 

a[0][0] = 2 
a #=> [[2], [], [], [], []] 
a[3][2] = 4 
a #=> [[2], [], [], [nil, nil, 4], []] 
a[1] << 1 
a #=> [[2], [1], [], [nil, nil, 4], []] 
a[1] << 2 
a #=> [[2], [1, 2], [], [nil, nil, 4], []] 
a[1] << 3 << 4 
a #=> [[2], [1, 2, 3, 4], [], [nil, nil, 4], []] 
a[2] << [4,5] 
a #=> [[2], [1, 2, 3, 4], [[4, 5]], [nil, nil, 4], []] 
a[4].concat([4,5]) 
a #=> [[2], [1, 2, 3, 4], [[4, 5]], [nil, nil, 4], [4, 5]] 

a = Array.new(3) { Array.new(3) } 
    #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]] 
a[1][2] = 4 
a #=> [[nil, nil, nil], [nil, nil, 4], [nil, nil, nil]] 

Мы могли бы также написать по умолчанию в качестве второго аргумента:

a = Array.new(3,[]) #=> [[], [], []] 

но это может быть проблематичным:

a[0][0] = 'cat' 
a #=> [["cat"], ["cat"], ["cat"]] 

как:

a = Array.new(3,Array.new(2)) #=> [[], [], []] 
    #=> [[nil, nil], [nil, nil], [nil, nil]] 
a[0][0] = 'cat' 
a #=> [["cat", nil], ["cat", nil], ["cat", nil]] 

Поскольку каждый элемент a представляет собой тот же массив.

Обратите внимание, что Ruby обеспечивает удобство для записи определенных методов, которые обычно называются «syntactic sugar». Если, например, вы пишете a = [1,2,3], Ruby будет интерпретировать это как a = Array.[](1,2,3) (и вы могли бы написать его таким образом), метод класса - Array::[]. Аналогичным образом, если a равно [1,2,3], a[1] = 'cat' декодируется как a.[]=(1, 'cat') и a[1] #=> 'cat' - a.[](1). Аналогично, h = {} переводит на h = Hash.new и так далее.

Обратите внимание, что Ruby не имеет понятия «многомерные массивы». Для получения дополнительной информации вы можете увидеть комментарий слева на this question.