0
Posted on Tuesday, June 30, 2020 by 醉·醉·鱼 and labeled under
前任留下了一个祖传代码,看着挺好的,通过一个build方法,就可以动态创建一个新的类。等到自己去实现第二个类的时候,出了问题。say方法被覆盖了。第一感觉就是,类被重新打开,然后被覆写了。

后来,在尝试打印self的时候,发现block是在顶级作用域main里面执行的。导致的结果就是,第二次会覆盖第一次的方法定义,而且所有地方都有这个方法,无论是类方法,还是实例方法。
问题到这里,就是切换context的问题了。用class_eval可以切换context到新建的类执行代码块,进而定义实例方法。

参考 https://stackoverflow.com/questions/19319138/dynamically-create-a-class-inherited-from-activerecord