class A
def method_missing(name, *args)
if name.to_s =~ /^*=/
if self.methods.include? name.to_s.delete("=").to_sym
instance_variable_set("@#{name}".delete("="),args.first)
else
instance_variable_set("@#{name}".delete("="),args.first)
self.class.send(:define_method,"#{name}".delete("=") ) do
instance_variable_get("@#{name}".delete("="))
end
end
else
super
end
end
end
改进一下:
class A
def method_missing(name, *args)
if name.to_s =~ /^*=/
self.class.send(:define_method,"#{name}".delete("=") ) do
args.first
end
else
super
end
end
end
测试:
测试:
a = A.new
a.jamst = 123
a.jamst #=>123
实现一个二维表单的查询和修改:
class Excell
def method_missing(name, *args)
p name
if name.to_s =~ /^change.*=/
split_str = name.to_s.delete("=").split("_")
eval %Q(self.row_#{split_str[1].to_i-1}[#{split_str[2].to_i-1}] = args.first)
eval %Q(self.cols_#{split_str[2].to_i-1}[#{split_str[1].to_i-1}] = args.first)
self.class.send(:define_method,"#{name}".delete("=")) do
args.first
end
elsif name.to_s =~ /^equal*/
split_str = name.to_s.split("_")
self.class.send(:define_method,"#{name}") do
eval %Q(
self.row_#{split_str[1].to_i-1}[#{split_str[2].to_i-1}]
)
end
return eval %Q(
self.row_#{split_str[1].to_i-1}[#{split_str[2].to_i-1}]
)
elsif name.to_s =~ /^*=/
self.class.send(:define_method,"#{name}".delete("=") ) do
args.first
end
else
super
end
end
end
# 初始化一个类
a = Excell.new
a.row_size = 4
a.cols_size = 100
a.row_0 = *(1..100)
a.row_1 = *(1..100)
a.row_2 = *(1..100)
a.row_3 = *(1..100)
a.cols_size.times.each do |_|
cos = []
a.row_size.times.each do |s|
eval "cos << a.row_#{s}[#{_}]"
end
eval "a.cols_#{_} = cos"
end
#查询数值 a.equal_x_y
#修改数值 a.change_x_y
# a.equal_2_50 == a.row_1[49]
# a.equal_2_50 == a.cols_49[1]
#测试:
a.equal_2_50
a.change_2_50 = 111
a.row_1[49]