Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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,我有一个循环,它应该根据数组中包含的filename分配不同的变量名 每个变量都设置为空数组 filenames = ['file1', 'file2'] filenames.each do |filename| "@data_" + "#{filename}" = [] # used @ as I need these variables externaly from the loop end 这给了我以下的错误 syntax error, unexpected '=',

我有一个循环,它应该根据数组中包含的filename分配不同的变量名

每个变量都设置为空数组

filenames = ['file1', 'file2']

filenames.each do |filename|
  "@data_" + "#{filename}" = []        # used @ as I need these variables externaly from the loop
end
这给了我以下的错误

syntax error, unexpected '=', expecting keyword_end
我不明白的是如果我使用

filenames.each do |filename|
  p "@data_" + "#{filename}"
end
它渲染正确

@data_file1
@data_file2
如果我在循环中设置一个空数组

filenames.each do |filename|
  @data = []
end
p @data
#=> []
它也有用


谢谢你的帮助

我建议使用数据结构,而不是通过元编程合成实例变量1

为什么不只是:

@data = filenames.inject({}) { |h, v| h[v] = []; h }
# => { "file1" => [], "file2" => [] }
现在,您可以在需要“file1”数组对象的位置引用
@data['file1']


一,。但为了记录在案,这里有一种方法:

class A
  def f x, y
    self.class.send :attr_accessor, x
    send "#{x}=", y
  end
end

a = A.new
a.f 'new_instance_variable', 12345
p a.new_instance_variable

我建议使用数据结构,而不是通过元编程合成实例变量1

为什么不只是:

@data = filenames.inject({}) { |h, v| h[v] = []; h }
# => { "file1" => [], "file2" => [] }
现在,您可以在需要“file1”数组对象的位置引用
@data['file1']


一,。但为了记录在案,这里有一种方法:

class A
  def f x, y
    self.class.send :attr_accessor, x
    send "#{x}=", y
  end
end

a = A.new
a.f 'new_instance_variable', 12345
p a.new_instance_variable

如果您确信文件名数组的完整性,最简单的解决方案是:

filenames = ['file1', 'file2']

filenames.each do |filename|
  eval "@data_#{filename} = []"
end

如果您确信文件名数组的完整性,最简单的解决方案是:

filenames = ['file1', 'file2']

filenames.each do |filename|
  eval "@data_#{filename} = []"
end

为什么在同一个字符串中使用字符串连接和插值

差不多

p "@data_#{filename}"
和你的一样

p "@data_" + "#{filename}"
现在这将不起作用,因为您试图说string=您需要评估字符串的其他内容

eval("@data_#{filename} = []")

为什么在同一个字符串中使用字符串连接和插值

差不多

p "@data_#{filename}"
和你的一样

p "@data_" + "#{filename}"
现在这将不起作用,因为您试图说string=您需要评估字符串的其他内容

eval("@data_#{filename} = []")

您在
“@data_”+“#{filename}”=[]
中所做的是将空数组实例(
[]
)分配给字符串实例(
“@data_file1”
),因此
语法错误,意外的“=”,需要关键字\u end

您应该想做的是将
[]
赋值给实例变量:
@data\u file
,而不是字符串:
“@data\u file”

您可以使用类
对象的
实例\u变量\u集
方法实现这一点:

filenames = ['file1', 'file2']

filenames.each do |filename|
    instance_variable_set("@data_#{filename}".to_sym, [])
end

您在
“@data_”+“#{filename}”=[]
中所做的是将空数组实例(
[]
)分配给字符串实例(
“@data_file1”
),因此
语法错误,意外的“=”,需要关键字\u end

您应该想做的是将
[]
赋值给实例变量:
@data\u file
,而不是字符串:
“@data\u file”

您可以使用类
对象的
实例\u变量\u集
方法实现这一点:

filenames = ['file1', 'file2']

filenames.each do |filename|
    instance_variable_set("@data_#{filename}".to_sym, [])
end

您可能应该在Ruby 1.9中添加这一点。您可能应该在Ruby 1.9中添加这一点。Hash[pairs]可能是一种更干净的创建哈希的方法。让我们希望Ruby有一天能成为可枚举的(Enumerable)#mash,我们都同意如何从可枚举中创建哈希。在这种情况下,
每个带有_对象的
都比
注入
简单。哈希[pairs]可能是一种更干净的哈希创建方法。让我们希望Ruby有一天能成为可枚举的(Enumerable)#mash,我们都同意如何从可枚举中创建哈希。
每个带有_对象的
在这种情况下比
注入
简单。+1用于自己尝试解决它。+1用于自己尝试解决它。