为什么子类化ActiveSupport :: TimeZone会破坏其类级别的[]运算符?

克里斯·B

带着一些恐惧,我决定继承子类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
安德鲁·拉森(Andrew Larson)

该方法依赖于调用您的子类没有[]@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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么子类化ActiveSupport :: TimeZone会中断其类级[]运算符?

来自分类Dev

为什么子类会包含Puppet模块的主类?

来自分类Dev

为什么子类看不到父类的方法?

来自分类Dev

实例子类化,为什么会产生新的实例?

来自分类Dev

为什么单例类不能被子类化?

来自分类Dev

为什么子类的子类不能访问其祖先的受保护成员?

来自分类Dev

为什么子类不覆盖其超类变量的值?

来自分类Dev

在此示例中,为什么子类不继承python中父类的方法?

来自分类Dev

为什么子类已经覆盖了父类的静态方法呢?

来自分类Dev

为什么子类不覆盖python中基类的字段以及如何处理

来自分类Dev

为什么子类不覆盖python中基类的字段以及如何处理

来自分类Dev

为什么子类重写虚拟函数不能更改父类的默认函数参数?

来自分类Dev

用运算符子类化模板类

来自分类Dev

在某些情况下,使用ByteBuddy子类化类时,会收到IllegalAccessErrors。为什么?

来自分类Dev

在C#中,为什么子类字段的默认值不覆盖超类字段的默认值?

来自分类Dev

在C#中,为什么子类字段的默认值不覆盖超类字段的默认值?

来自分类Dev

为什么子弹会走错方向?

来自分类Dev

我在子类中覆盖了一个属性的setter,但是当我在超类的init方法中调用它时,为什么子类的方法响应?

来自分类Dev

为什么按值返回的未命名对象在调用其转换运算符之前会被破坏?

来自分类Dev

为什么即使子类化时函数会传递给函数的协议默认值也不会更改?

来自分类Dev

子类化,赋值运算符和副本构造函数

来自分类Dev

Python:子类化元组和运算符

来自分类Dev

为什么子类成员不受保护?

来自分类常见问题

为什么子进程getoutput会增加非恒定开销?

来自分类Dev

为什么子查询中的on差异会影响PostgreSQL的性能?

来自分类Dev

为什么子进程getoutput会增加非恒定开销?

来自分类Dev

子类化的子类LinearLayout类

来自分类Dev

子类化未来类

来自分类Dev

子类化未来类

Related 相关文章

  1. 1

    为什么子类化ActiveSupport :: TimeZone会中断其类级[]运算符?

  2. 2

    为什么子类会包含Puppet模块的主类?

  3. 3

    为什么子类看不到父类的方法?

  4. 4

    实例子类化,为什么会产生新的实例?

  5. 5

    为什么单例类不能被子类化?

  6. 6

    为什么子类的子类不能访问其祖先的受保护成员?

  7. 7

    为什么子类不覆盖其超类变量的值?

  8. 8

    在此示例中,为什么子类不继承python中父类的方法?

  9. 9

    为什么子类已经覆盖了父类的静态方法呢?

  10. 10

    为什么子类不覆盖python中基类的字段以及如何处理

  11. 11

    为什么子类不覆盖python中基类的字段以及如何处理

  12. 12

    为什么子类重写虚拟函数不能更改父类的默认函数参数?

  13. 13

    用运算符子类化模板类

  14. 14

    在某些情况下,使用ByteBuddy子类化类时,会收到IllegalAccessErrors。为什么?

  15. 15

    在C#中,为什么子类字段的默认值不覆盖超类字段的默认值?

  16. 16

    在C#中,为什么子类字段的默认值不覆盖超类字段的默认值?

  17. 17

    为什么子弹会走错方向?

  18. 18

    我在子类中覆盖了一个属性的setter,但是当我在超类的init方法中调用它时,为什么子类的方法响应?

  19. 19

    为什么按值返回的未命名对象在调用其转换运算符之前会被破坏?

  20. 20

    为什么即使子类化时函数会传递给函数的协议默认值也不会更改?

  21. 21

    子类化,赋值运算符和副本构造函数

  22. 22

    Python:子类化元组和运算符

  23. 23

    为什么子类成员不受保护?

  24. 24

    为什么子进程getoutput会增加非恒定开销?

  25. 25

    为什么子查询中的on差异会影响PostgreSQL的性能?

  26. 26

    为什么子进程getoutput会增加非恒定开销?

  27. 27

    子类化的子类LinearLayout类

  28. 28

    子类化未来类

  29. 29

    子类化未来类

热门标签

归档