我想通过搜索关键字对项目进行分类。对于每个项目类型,我都有一系列关键词。我将使用变量名作为项目类型,并将变量的内容用作匹配的关键字。
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
答案 0 :(得分:2)
您可以使用以下任何一项:
a = 1
b = 2
c = 3
vars = %w[a b c]
vars.each { |v| puts eval(v) }
输出:
1
2
3
=> ["a", "b", "c"]
vars.each { |v| puts binding.local_variable_get(v) }
答案 1 :(得分:1)
我将使用变量名作为项目类型......
不要使用变量名来表示数据。变量应该引用数据,而不是数据。这就是我如何接近它。
首先,我会为项目类型创建一个小class。该类应具有两个属性name
和keywords
。这可以使用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 类。
当然,问题是你想通过一个名字的字符串来访问变量.....