2011-03-13 20 views
0

我在我的控制器多維數組全局定義如下:如何在Ruby中定義和引用多維數組?

def ch 
    @ch = Array.new(1){[]} 
    @ch[0][0] = "Option 1" 
    @ch[0][1] = "Option 2" 
end 

(我不知道這是否是最好做的數組,但我發現一個例子在網上做這種方式)

在我的控制器操作調用「測試」,我無法適當地打印數組的值。

def test 
    logger.debug ch 
    logger.debug ch[0] 
    logger.debug ch[1] 
    logger.debug ch[0][0] 
    logger.debug ch[0][1] 
end 

標準輸出分別顯示

Option 2 
79 
112 
1 
1 

爲5報表記錄以下的整數爲什麼顯示?任何想法如何獲得數組值選項1和選項2顯示?

如果我定義的動作本身(而不是做全球性的動作之外)的陣列,我得到預期的結果,即ch[0][0]顯示選項1和ch[0][1]顯示選項2。最後,我希望有機會到陣列中的我的看法。可能有更好的方法來做到這一點。

回答

4

這裏有一些事情正在進行。

  1. 在Ruby中,方法的最後一行是該方法的返回值;所以ch的返回值是"Option 2"。讓我們驗證這一點上IRB,Ruby的REPL:

    [BinaryMuse ~]: irb 
    ruby-1.9.2-p136 :001 > def ch 
    ruby-1.9.2-p136 :002?> ary = Array.new(1){[]} 
    ruby-1.9.2-p136 :003?> ary[0][0] = "Option 1" 
    ruby-1.9.2-p136 :004?> ary[0][1] = "Option 2" 
    ruby-1.9.2-p136 :005?> end 
    => nil 
    ruby-1.9.2-p136 :006 > ch 
    => "Option 2" 
    
  2. test,您呼叫的ch方法,而不是引用@ch變量。因此logger.debug ch相當於logger.debug "Option 2",因此ch[0]是「選項2」的第一個字符,即「O」,其具有ASCII碼79.對於ch[1]也是如此,其爲「p」,ASCII碼爲112 。ch[0][0]返回79的最低有效位,即1,依此類推。

  3. 即使更改test使用@ch,而不是調用ch方法,@ch仍然沒有定義,因爲你還沒有叫ch您的請求期間成立@ch變量。您可以通過在控制器中一個before_filter做到這一點:

    class WhateverController 
        before_filter :ch 
    
        def ch 
        # your code 
        end 
    
        def test 
        logger.deubg @ch 
        # etc. 
        end 
    end 
    
2

你是混亂的方法和變量。當你這樣做時

def ch 
... 
end 

你正在定義一個方法,該方法返回的是最後一個評估過的東西。在這種情況下,你的方法做的最後一件事是:

@ch[0][1] = "Option 2" 

計算結果爲"Option 2"。因此,當您調用您的方法ch時,它將返回"Option 2"。這就是爲什麼

logger.debug ch 

日誌"Option 2"。你的方法ch你正在創建一個實例變量@ch。要記錄值,您想要的方式,你就必須改變這樣的日誌記錄代碼:

logger.debug @ch 
logger.debug @ch[0] 
logger.debug @ch[1] 
logger.debug @ch[0][0] 
logger.debug @ch[0][1] 

但是,對於這個工作,你必須確保它創建@ch實例變量的代碼已經在執行test方法之前執行。這樣做的一個方法是通過你的ch方法調用,使用before_filter

class YourControllerClassName 
    before_filter :ch 
2

爲什麼整數說明了什麼?

因爲ch方法返回一個「選項2」字符串,並調用[]方法上的繩子將你想獲得指數回報信的整數值(ASCII碼)(即CH [1]返回「p」字符的int值)。

任何想法如何獲得數組值選項1和選項2顯示?

定義CH方法:

def ch 
    ch = Array.new(1){[]} 
    ch[0][0] = "Option 1" 
    ch[0][1] = "Option 2" 
    return ch 
end 

還是保留原樣,並modivie測試方法:

def test 
    ch # initialize the @ch instance variable 
    logger.debug @ch 
    logger.debug @ch[0] 
    logger.debug @ch[1] 
    logger.debug @ch[0][0] 
    logger.debug @ch[0][1] 
end 

我認爲這將是有益的。 乾杯。