Ruby 通过循环指定不同的变量名(为nil数组)
我有一个循环,它应该根据数组中包含的filename分配不同的变量名 每个变量都设置为空数组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 '=',
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用于自己尝试解决它。