Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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_Variables - Fatal编程技术网

Ruby 局部变量定义的缩写,不返回任何内容

Ruby 局部变量定义的缩写,不返回任何内容,ruby,variables,Ruby,Variables,我想减少一些代码中的变量定义;特别是那些只定义空哈希或数组的。我找到的解决方案是: 原件: my_array = Array.new 0..10.each do |i| my_array << i end 重做版本: 0..10.each do |i| ( my_array ||= Array.new ) << i end 当我在rails控制台中运行这两个版本时,会发生以下情况:在运行原始版本后,我可以访问“my_array”,而对于重做版本,我无法访问…

我想减少一些代码中的变量定义;特别是那些只定义空哈希或数组的。我找到的解决方案是:

原件:

my_array = Array.new

0..10.each do |i|
  my_array << i
end
重做版本:

0..10.each do |i|
  ( my_array ||= Array.new ) << i
end
当我在rails控制台中运行这两个版本时,会发生以下情况:在运行原始版本后,我可以访问“my_array”,而对于重做版本,我无法访问……它仍然是未定义的。我做错了什么?

因为我的数组在您修改的版本中的作用域仅限于块

请尝试定义一个全局变量

1.9.3-p448 :001 > 
1.9.3-p448 :002 >   [*0..10].each do |i|
1.9.3-p448 :003 >     ( @my_array ||= Array.new ) << i
1.9.3-p448 :004?>    end
 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
1.9.3-p448 :005 > @my_array
 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
1.9.3-p448 :006 > 
在控制台中使用@variables会给出一个全局范围,因为修改版本中my_数组的范围仅取决于块

请尝试定义一个全局变量

1.9.3-p448 :001 > 
1.9.3-p448 :002 >   [*0..10].each do |i|
1.9.3-p448 :003 >     ( @my_array ||= Array.new ) << i
1.9.3-p448 :004?>    end
 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
1.9.3-p448 :005 > @my_array
 => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
1.9.3-p448 :006 > 

在控制台中使用@variables会给出一个全局范围

在第二个示例中,变量my_数组是块的局部变量,因此它在块本身之外不可见。对于这类工作,我喜欢使用以下方法:


在第二个示例中,变量my_array是块的局部变量,因此它在块之外不可见。对于这类工作,我喜欢使用以下方法:


一般来说,我发现如果您必须声明一个空容器,然后运行一个循环来填充内容,那么几乎总是有更好的方法

以下是编写代码的改进方法:

my_array = (0..10).map do |i|
  i # do your complex processing here
end

my_array # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

一般来说,我发现如果您必须声明一个空容器,然后运行一个循环来填充内容,那么几乎总是有更好的方法

以下是编写代码的改进方法:

my_array = (0..10).map do |i|
  i # do your complex processing here
end

my_array # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

在这种情况下,我喜欢使用比EnumerableAch_with_object更通用的方法:


在这种情况下,我喜欢使用比EnumerableAch_with_object更通用的方法:


在循环之前定义my_array=nil,在第二种解决方案中,这将违背其目的?您必须在范围周围加上括号,即0..10。each.my_array=*0..10是一种简洁的方法,可以精确执行OP中的代码所做的操作,但可能与现实世界的要求相差太远,因此不是一个好的答案。在循环之前定义my_array=nil,在第二种解决方案中,这将违背其目的?您必须在范围内加上括号,即0..10。each.my_array=*0..10是一种简洁的方法,可以精确执行OP中的代码所做的操作,但可能与现实世界的要求相差太远,因此不是一个好的答案。您建议使用全局可变状态吗?这是不好的做法。考虑到范围是他唯一需要解决的问题。总之@toro2k的答案是更好的,你建议使用全局可变状态吗?这是不好的做法。考虑到范围是他唯一需要解决的问题。总之@toro2k的答案是更好的,所以我的数组=array.new11{i|i | which|u function i}@Arup Rakshit:我想这和Sergio的答案是一样的,第一句话说了我想说的,只是语法不同。还有我的数组=array.new11{i | which function i}@阿鲁普·拉克什:我想这和塞尔吉奥的答案是一样的,第一句话说的是我想说的,只是语法不同而已。