我有一个像这样的规范文件Spec.txt
title :Test
attribute :fieldOne, String
attribute :fieldTwo, Fixnum
constraint :fieldOne, 'fieldOne != nil'
constraint :fieldTwo, 'fieldTwo >= 0'
我需要动态创建一个类名为Test
的类,以及属性fieldOne
和fieldTwo
以及属性的约束。
到目前为止,我在文件中读取了分割行并将它们存储到数组中,然后使用
dynamic_name = @@TITLE
Object.const_set(dynamic_name, Class.new {
def init *args
...
end
})
但我不确定这是否是正确的方法,甚至现在如何创建属性和约束?
答案 0 :(得分:1)
一种方法可能是:
file=File.open('Spec.txt')
attrs=[]
constraints=[]
all_attrs=""
new_class=""
file.each do |line|
if line =~ /title/
value= line.split[1].tr(':,','')
new_class=value
elsif line =~ /attribute/
value= line.split[1]
attrs << value
elsif line =~ /constraint/
field= line.split[2].tr('\'','')
constraint= line.split[3]
constraints << "\n def #{field}=\n validation here (#{constraint}) \n end\n"
end
end
attrs.map!{|attr| attr+" "}
all_attrs.chomp!(", ")
all_constraints=constraints.join
result=
"Class "+new_class+"\n"+
"attr_reader "+
"#{all_attrs}\n"+
"#{all_constraints}\n"+
"end\n"
printf "#{result}"
运行:
$ ruby create_class.rb
Class Test
attr_reader :fieldOne, :fieldTwo
def fieldOne=
validation here (!=)
end
def fieldTwo=
validation here (>=)
end
end
$
需要对验证进行更多的工作,但你明白了。
要立即使用,您可以将输出发送到ruby文件,然后将其作为代码包含在内,例如
# You would add this after the first section of code, after the 'printf "#{result}"'
File.open("#{new_class}.rb", "w") do |file|
file.write(result)
end
require_relative "#{new_class}.rb"
test_it= Object.const_get(new_class).new
puts "#{test_it}"
否则,如果创建ruby文件就足够了:
ruby create_class.rb > class.rb
正如沃恩所说。