如何通过包含其名称的字符串引用变量?

时间:2018-06-14 06:26:43

标签: ruby

我想通过搜索关键字对项目进行分类。对于每个项目类型,我都有一系列关键词。我将使用变量名作为项目类型,并将变量的内容用作匹配的关键字。

project_detail = "Build a school"
a   = %w[education school]
b       = ["Health Care", "Clean Water"]
projects    = %w[a b]
project_type = String.new
projects.each do |e|
   # How to refer to the variable a and b? (I used one of the answers)
   eval(e).each do |keyword|        
       project_type = e if project_detail.match(/#{keyword}/)
   end  
end

3 个答案:

答案 0 :(得分:2)

您可以使用以下任何一项:

1。 EVAL

a = 1
b = 2
c = 3
vars = %w[a b c]
vars.each { |v| puts eval(v) }

输出:

1
2
3
 => ["a", "b", "c"]

2。结合#local_variable_get

vars.each { |v| puts binding.local_variable_get(v) }

答案 1 :(得分:1)

  

我将使用变量名作为项目类型......

不要使用变量名来表示数据。变量应该引用数据,而不是数据。这就是我如何接近它。

首先,我会为项目类型创建一个小class。该类应具有两个属性namekeywords。这可以使用class关键字完成:

class ProjectType
  attr_accessor :name, :keywords

  def initialize(name, keywords)
    @name = name
    @keywords = keywords
  end
end

或通过Struct

ProjectType = Struct.new(:name, :keywords)

然后,我将创建一个包含所有项目类型的数组:

@project_types = [
  ProjectType.new('a', %w[education school]),
  ProjectType.new('b', ['Health Care', 'Clean Water'])
]

现在,我们需要一种按关键字查找项目的方法。我会把它包装在一个方法中:

def find_project_type(name)
  @project_types.find do |prj|
    Regexp.union(prj.keywords) =~ name
  end
end

find遍历@project_types数组,返回块返回true的第一个元素。在块中,我们使用Regexp.union构建匹配所有项目关键字的正则表达式,并使用=~来执行匹配。

现在可以像这样使用该方法:

project_type = find_project_type("Build a school")
#=> #<struct ProjectType name="a", keywords=["education", "school"]>

可以通过以下方式检索项目类型的名称:

project_type.name
#=> "a"

答案 2 :(得分:0)

我想你的意思是你想使用变量 e 来获取a的内容。

在这种情况下,您可以使用eval(e),因为 e 属于 String 类。

当然,问题是你想通过一个名字的字符串来访问变量.....