2010-10-25 75 views
3

對不起新手問題。我試圖在ruby中創建一個二維數組,並將它的所有值初始化爲1.我的代碼創建了二維數組,但未能修改其任何值。修改二維紅寶石陣列的難度

任何人都可以解釋我做錯了什麼?

def mda(width,height) 
    #make a two dimensional array 
    a = Array.new(width) 
    a.map! { Array.new(height) } 

    #init all its values to 1 
    a.each do |row| 
     row.each do |column| 
      column = 1 
     end 
    end 
    return a 
    end 

回答

3

它的線row.each do |column|可變column是在row的值的副本。你不能以這種方式編輯它的值。你必須做到:

def mda(width,height) 
    a = Array.new(width) 
    a.map! { Array.new(height) } 
    a.each do |row| 
    row.map!{1} 
    end 
    return a 
end 

或者更好:

def mda(width,height) 
    a = Array.new(width) 
    a.map! { Array.new(height) } 

    a.map do |row| 
    row.map!{1} 
    end 
end 

或者更好:

def mda(width,height) 
    a = Array.new(width){ Array.new(height) } 
    a.map do |row| 
    row.map!{1} 
    end 
end 

或者更好:

def mda(width,height) 
    Array.new(width) { Array.new(height){1} } 
end 
+0

'寬度'和'高度'混合在一起嗎?此外,這可以做到沒有塊:Array.new(height,Array.new(width,1)) – steenslag 2010-10-25 08:08:16

+0

@steenslag,不,它不能。如果您以這種方式構建多維數組,則當您將值分配給其中的一個元素時,它將會擴展到整個列。這就像'array = [[1] * w] * h',你只需要將*指針的'h'拷貝到同一個一維數組中。關於「寬度」和「高度」的混合 - 這是另一個問題,這不應該由作者討論。 – Nakilon 2010-10-25 08:28:39

+0

P.S.:看到ghostdog74的回答。它必須至少有一個塊。 – Nakilon 2010-10-25 08:37:06

-1

在嵌套循環eachcolumn的價值在那個地方數組中引用的副本,而不是一個指針/它,所以當你改變它的價值你只改變了拷貝的值(在塊外停止存在)。

如果你只是想1 S作爲這個簡單的東西填充將工作一個二維數組:

def mda(width,height) 
    [ [1] * width ] * height 
end 

很簡單。


順便說一句,如果你想知道如何修改爲你遍歷它的二維數組的元素,這裏有一個方法(在你的代碼從第6行開始):

#init all its values to 1 
a.length.times do |i| 
    a[i].length.times do |j| 
    a[i][j] = 1 
    end 
end 
+0

下看到Nakilon的答覆意見:這個數組創建呢不工作(嘗試改變它的一個值)。 – steenslag 2010-10-25 09:26:29

1

each通入塊參數的每個元件的值,不是元素本身,所以column = 1實際上不修改該數組。

您可以一步完成此操作 - 請參閱the API docs以瞭解各種形式的Array#new的詳細信息。試試a = Array.new(width) {|i| Array.new(height) {|j| 1 } }

+2

不使用時不需要包含塊變量。 – 2010-10-25 11:53:40

+0

我不知道。我認爲他們就像方法參數,如果他們缺席,Ruby會抱怨。很好 - YLSNED! – Chowlett 2010-10-25 16:15:45

0

你可以這樣創建它嗎?

a=Array.new(width) { Array.new(height,1) }