Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中定义和引用多维数组?_Ruby_Multidimensional Array - Fatal编程技术网

如何在Ruby中定义和引用多维数组?

如何在Ruby中定义和引用多维数组?,ruby,multidimensional-array,Ruby,Multidimensional Array,我的控制器中有多维数组的全局定义,如下所示: def ch @ch = Array.new(1){[]} @ch[0][0] = "Option 1" @ch[0][1] = "Option 2" end (我不确定这样做是否最好,但我在网上找到了一个这样做的例子) 在名为“test”的控制器操作中,我无法正确打印数组的值 def test logger.debug ch logger.debug ch[0] logger.debug ch[1] logger.de

我的控制器中有多维数组的全局定义,如下所示:

def ch
  @ch = Array.new(1){[]}
  @ch[0][0] = "Option 1"
  @ch[0][1] = "Option 2"
end
(我不确定这样做是否最好,但我在网上找到了一个这样做的例子)

在名为“test”的控制器操作中,我无法正确打印数组的值

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。最后,我希望能够访问视图中的阵列。也许有更好的方法可以做到这一点。

这里有一些事情

  • 在Ruby中,方法的最后一行是该方法的返回值;因此
    ch
    的返回值是
    “选项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"
    
  • test
    中,您调用的是
    ch
    方法,而不是引用
    @ch
    变量<因此,code>logger.debug ch相当于
    logger.debug“Option 2”
    ,因此
    ch[0]
    是“Option 2”的第一个字符,即“O”,具有ASCII代码79。这同样适用于
    ch[1]
    ,即带有ASCII码112的“p”
    ch[0][0]
    返回79的最低有效位,即1,依此类推

  • 即使将
    test
    更改为使用
    @ch
    而不是调用
    ch
    方法,
    @ch
    仍然没有定义,因为您尚未在请求期间调用
    ch
    来设置
    @ch
    变量。您可以通过控制器中的
    before\u过滤器执行此操作:

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

  • 你混淆了方法和变量。当你这样做的时候

    def ch
    ...
    end
    
    您正在定义一个方法,而该方法返回在其中计算的最后一个内容。在本例中,您在方法中所做的最后一件事是:

    @ch[0][1] = "Option 2" 
    
    其计算结果为
    “选项2”
    。因此,当您调用方法
    ch
    时,它将返回
    “选项2”
    。这就是为什么

    logger.debug ch
    
    日志
    “选项2”

    现在,在方法
    ch
    中,您正在创建一个实例变量
    @ch
    。要按您希望的方式记录值,您必须更改日志代码,如下所示:

    logger.debug @ch
    logger.debug @ch[0]
    logger.debug @ch[1]
    logger.debug @ch[0][0]
    logger.debug @ch[0][1]
    
    但是,要使其工作,您必须确保在执行
    test
    方法之前已执行创建
    @ch
    实例变量的代码。一种方法是在过滤器之前使用
    调用
    ch
    方法:

    class YourControllerClassName
      before_filter :ch
    
    为什么整数会显示

    因为
    ch
    方法返回一个“Option 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
    
    或保持原样,修改试验方法:

    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
    
    我认为这会有帮助。 干杯