元编程实现类属性自定义


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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值