Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/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 数组展平不起作用(实例变量nil)_Ruby - Fatal编程技术网

Ruby 数组展平不起作用(实例变量nil)

Ruby 数组展平不起作用(实例变量nil),ruby,Ruby,我试图编写一个简单的数组展平方法,,但使用实例变量无法工作。它只能使用类变量工作。有人能告诉我为什么吗?以及如何使用实例变量使其工作 class Array @y = [] def flatten_array self.each do |x| if x.class.to_s != 'Array' @y << x else x.flatten_array end end return @y end

我试图编写一个简单的数组展平方法,,但使用实例变量无法工作。它只能使用类变量工作。有人能告诉我为什么吗?以及如何使用实例变量使其工作

 class Array
 @y = []
  def flatten_array
   self.each do |x|
    if x.class.to_s != 'Array'
    @y <<  x
     else
     x.flatten_array
    end
   end 
   return @y  
  end  
 end


 a =  [1,2,3,4,5]
 b =  [6,7,8]
 c =  [9,10]
 a1 = [12,13,a,b,c]
 puts a1.inspect
 b1 = a1.flatten_array
 puts b1.inspect
类数组
@y=[]
def展平阵列
self.each do|x|
如果x.class.to_!='数组'

@y对于实例变量,它不起作用的原因是x.flatte_数组使用的是一个新的
@y
,而不是您正在累积的那个。然而,以这种方式使用实例或类变量并不是一种好的做法,因为它有效地将全局变量用于局部函数

编写需要额外变量的递归函数的标准过程是使用辅助函数:

def flatten_array
  int_flatten(self, [])
end

private 
def int_flatten(a, result)
  a.each do |elem|
    if (elem.is_a? Array)
      int_flatten(elem, result)
    else
      result << elem
    end
  end
  return result
end
def展平阵列
int_展平(自身,[])
结束
私有的
def int_展平(a,结果)
a、 每个do | elem|
if(元素是数组)
整平(元素、结果)
其他的
结果


只是好奇:你想完成什么?已经有了一个
数组#flatte
,你知道……为什么你想使用实例变量而不是局部变量?标题中有一个“实例”的拼写错误。收件人:Marc AndréLafortune我只是想写我自己的数组_flatte来更好地理解Ruby。致:Andrew Grimm感谢您指出标题中的拼写错误。然而,这并没有回答我的问题。凯西,谢谢你的回答。我想局部变量可能不起作用,但显然我错了。我试过了你的两段代码。第二个有效,第一个无效。请参见下面的内容。代码段1:类数组定义展平数组整平数组整平数组结果=[]每个do | elem | if(elem.is | a?Array)整平数组(elem,result)其他结果代码段2:类数组定义展平数组结果=[]每个do | elem | if(elem.is | a?Array)result+=elem.flatten\u数组的其他结果Kathy,您错过了第一个结果中的返回结果。它在投入回报后起作用。。class Array def flatten_Array result=int_flatte(self,[])返回结果end私有def int_flatten(a,result)a.each do | elem | if(elem.is_a?Array)int_flatte(elem,result)else结果我将编辑我的响应。我也看到我错过了一个返回结果。
def flatten_array
  result = []
  each do |elem|
    if (elem.is_a? Array)
      result += elem.flatten_array
    else
      result << elem
    end
  end
  return result
end
a =  [1,2,3,4,5]
b =  [6,7,8]
c =  [9,10]
a1 = [12,13,a,b,c]

puts a1.inspect
#=> [12, 13, [1, 2, 3, 4, 5], [6, 7, 8], [9, 10]]

puts a1.flatten.inspect
#=> [12, 13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]