带着一些恐惧,我决定继承子类ActiveSupport::TimeZone
,但是我走得很远,因为当我调用[]
子类时,它无法调用超类的[]
方法。我认为这可能与操作符重载发生在类方法中有关,因此我尝试了以下方法:
Loading development environment (Rails 4.2.1)
2.2.1 :001 > class Foo; def Foo.[](f); f; end; end
=> :[]
2.2.1 :002 > Foo['baz']
=> "baz"
2.2.1 :003 > class Bar < Foo; end
=> nil
2.2.1 :004 > Bar['baz']
=> "baz"
因此,它的工作完全符合我的预期。但是,如果这行得通,那为什么会失败呢?
2.2.1 :005 > ActiveSupport::TimeZone["America/New_York"]
=> #<ActiveSupport::TimeZone:0x007f80835c18a8 @name="America/New_York", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: America/New_York>, @current_period=#<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionDefinition: #<TZInfo::TimeOrDateTime: 1425798000>,#<TZInfo::TimezoneOffset: -18000,3600,EDT>>,#<TZInfo::TimezoneTransitionDefinition: #<TZInfo::TimeOrDateTime: 1446357600>,#<TZInfo::TimezoneOffset: -18000,0,EST>>>>
2.2.1 :006 > class T < ActiveSupport::TimeZone; end
=> nil
2.2.1 :007 > T["America/New_York"]
NoMethodError: undefined method `[]' for nil:NilClass
该方法依赖于调用您的子类没有[]
的@lazy_zones_map
实例变量。
编辑:行为的示例:
class Foo
@foo = []
def self.[](arg)
@foo[arg]
end
end
class Bar < Foo
end
Foo[0] #=> nil
Bar[0] #=> undefined method `[]` for nil:NilClass
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句