Как определить и ссылаться на многомерные массивы в Ruby? - PullRequest
0 голосов
/ 13 марта 2011

У меня есть глобальное определение в моем контроллере для многомерного массива следующим образом:

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

stdout показывает следующее для 5 операторов логгера соответственно

Option 2
79
112
1
1

Почему целые числа показывают?Любая идея, как я могу получить значения массива Вариант 1 и Вариант 2, чтобы показать?

Если я определю массив в самом действии (не делая его глобально вне действия), я получу ожидаемые результаты, то есть ch[0][0]показывает Вариант 1 и ch[0][1] показывает Вариант 2. В конце концов, я хочу иметь доступ к массиву в моем представлении.Возможно, есть лучший способ сделать это.

Ответы [ 3 ]

4 голосов
/ 13 марта 2011

Здесь происходит несколько вещей.

  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 для настройки * Переменная 1029 * во время вашего запроса. Вы можете сделать это через before_filter в вашем контроллере:

    class WhateverController
      before_filter :ch
    
      def ch
        # your code
      end
    
      def test
        logger.deubg @ch
        # etc.
      end
    end
    
2 голосов
/ 13 марта 2011

Почему отображаются целые числа?

Поскольку метод ch возвращает строку «Option 2», а вызов метода [] для строки возвращает целочисленное значение (ASCIIкод) буквы в индексе, который вы хотите получить (т. е. ch [1] возвращает значение типа int символа «p»).

Любая идея, как получить значения массива Вариант 1 иВариант 2 для отображения?

Определите метод ch как:

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

Или оставьте его как есть и измените метод теста:

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

Iдумаю это будет полезно.Приветствия.

2 голосов
/ 13 марта 2011

Вы путаете методы и переменные. Когда вы делаете

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...