【问题标题】:Ruby: How to access object created by send without name? [duplicate]Ruby:如何访问由无名发送创建的对象? [复制]
【发布时间】:2016-06-29 10:48:46
【问题描述】:

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

所以,例如:

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

上面的当然行不通。

我整个上午都在为此绞尽脑汁、研究文档等等。感谢您的帮助!

有什么想法吗?

谢谢!

干杯, 凯尔

为清楚起见进行编辑:

好吧,我对send的理解有误。

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

所以上面的循环会创建三个数组:a_data,b_data,c_data

然后,我想用“foo”填充每个数组。

所以a_data[0] =&gt; "foo"

谢谢!

双重编辑:

这是我稍微改动过的实际代码,更全面地解释了我在做什么:

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

然后我有一个基于主题和相关关键字的哈希数组——例如“烹饪”->“器皿”、“烤箱”、“微波炉”。

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

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

# 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

感谢大家的帮助!

【问题讨论】:

  • object with a name 是什么意思?使用send,您可以向对象发送消息,而不是创建它们。此外,对象没有名称,然后可以有一个名为 name 的属性,如果你定义它,你似乎没有这样做。请详细说明您要达到的目标。
  • 你为什么要这样做?如果我理解正确,您希望能够dynamically set local variables,但正如帖子所建议的那样,使用哈希应该是好的
  • 在我的实际代码中,我有一个哈希数组。每个散列都有一个名称和一个关键字列表。我想遍历散列数组,将散列的关键字与较大文本中的字符串匹配,然后将这些匹配的句子保存到带有散列名称的新数组中。
  • 你需要这些变量做什么?动态设置变量是没有意义的,因为您只能硬编码其余部分。哈希似乎满足您的所有需求
  • 根据您上次的评论,为什么不使用关键字匹配创建一个新哈希?

标签: ruby-on-rails ruby


【解决方案1】:

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

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

另外,请注意data[key] ||= [] 技巧。它的意思是“查看data[key]。如果是nil,则用空数组初始化它”。初始化一次是惯用的方式。

您可以将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"]

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

【讨论】:

  • 是的!创建了一个哈希,现在可以完美运行。非常感谢!
猜你喜欢
  • 2016-04-12
  • 2013-10-18
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2018-03-12
相关资源
最近更新 更多