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}@阿鲁普·拉克什:我想这和塞尔吉奥的答案是一样的,第一句话说的是我想说的,只是语法不同而已。