最近项目打算从1.9.3升级到2.1.1, 目前线上同时跑着1.9.3和2.1.1,但是发现define_method在2.1.1下面生成的方法不再是public,而是根据上下文来判断.

比如以下代码:

class A
        
  private
        
  define_method :foo do
    puts 'foo from A'
  end
        
end
    
class B
      
  # private 注释掉private
  define_method :foo do
    puts 'foo from B'
  end
      
end
A.new.foo
     
1.9.3 #=> foo from A
2.0.0 #=> foo from A
2.1.1 #=> NoMethodError: private method `foo' called for #<A:0x007fe2ca13a9c0>
    
    
B.new.foo
     
1.9.3 #=> foo from B
2.0.0 #=> foo from B
2.1.1 #=> foo from B