Ruby:如何访问send而不是名字创建的对象?

时间:2016-06-29 10:48:47

标签: ruby-on-rails ruby

我在Ruby中尝试做的是创建一个名称来自字符串的对象(例如,在数组中)。然后我想在更进一步的代码中使用该对象。

所以,例如:

array = ["a", "b", "c"]
array.each do |x|
   send x + '_data'
   x + '_data' = []
   x + '_data' << "foo"
end

上述情况当然不起作用。

我整个上午都把我的大脑,文档和SO弄得一团糟。感谢您的帮助!

有什么想法吗?

谢谢!

干杯, 凯尔

为了清晰起见,

编辑:

好的,我对send的理解不正确。

对于数组中的每个字符串,我想创建一个数组。

所以上面的循环会创建三个数组:a_datab_datac_data

然后,我想用&#34; foo&#34;。

填充每个数组

所以a_data[0] => "foo"

谢谢!

重复编辑:

这是我稍微修改过的实际代码,更全面地解释了我正在做的事情:

我有一个包含数千条推文的大型json文件(不只是文本,而是来自twitter api的完整json)。

然后我有一系列基于主题和相关关键字的哈希 - 例如&#34;烹调&#34; - &GT; &#34;餐具&#34;,&#34;烤箱&#34;,&#34;微波炉&#34;。

我想遍历主题哈希数组并查看是否有任何主题关键字与推文文本中的单词匹配。

如果匹配,我想将该推文添加到新数组中。

# topics is an array of hashes. Each hash contains title and list of keywords    
    topics.each do |topic|
    # create an array with the topic's name to store matches
          (topic[:title] + '_tweets') = []
          topic[:keywords].each do |kw|
            # loop through array of hashes (parsed json) to check for keyword matches in strings
            tweets.each do |tweet|
              text = tweet["text"]
# if string contains keyword, add to the topic's array
              if text.include? kw
               (topic[:title] + '_tweets') << tweet
              end
            end
          end

感谢所有人的帮助!

1 个答案:

答案 0 :(得分:0)

为什么不创建Hash来保存您需要的数据?

array = ["a", "b", "c"]
data = {}
array.each do |x|
  key = x + '_data'
  data[key] ||= []
  data[key] << "foo"
end

另外,请注意data[key] ||= []技巧。这意味着&#34;调查data[key]。如果是nil,则使用空数组&#34;初始化它。这是初学一次的惯用方法。

您可以将data声明为Hash.new([])。然后你根本不需要data[key] ||= [],因为如果没有设置与给定键相关联的值,Hash.new([])将创建一个返回空数组的哈希。

这比使用variable variables from PHP

更灵活

但如果您真的需要这样的东西,您可以执行以下操作:

array = ["a", "b", "c"]
array.each do |x|
  instance_variable_set '@' + x + '_data', []
  instance_variable_get('@' + x + '_data') << "foo"
end

p @a_data # ["foo"]

这里我们在当前对象实例的上下文中创建一个实例变量。它的名称必须以@开头。