如何在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。最后,我希望能够访问视图中的阵列。也许有更好的方法可以做到这一点。这里有一些事情
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
我认为这会有帮助。
干杯