【问题标题】:Why the `singleton` methods can't be defined on `Fixnum`,`Bignum`,`Float`,`Symbol` class objects, but ` FalseClass` and `TrueClass` can have?为什么在 `Fixnum`、`Bignum`、`Float`、`Symbol` 类对象上不能定义 `singleton` 方法,但 `FalseClass` 和 `TrueClass` 可以定义?
【发布时间】:2023-03-27 23:20:01
【问题描述】:

为什么singleton方法不能在Fixnum,Bignum,Float,Symbol类对象上定义,而FalseClassTrueClass可以有?

C:\>ruby -v
ruby 2.0.0p0 (2013-02-24) [i386-mingw32]

C:\>irb --simple-prompt
DL is deprecated, please use Fiddle
11111111111.class
#=> Bignum
class << 11111111111 ; end
#TypeError: can't define singleton
#        from (irb):2
#        from C:/Ruby200/bin/irb:12:in `<main>'

1111.class
#=> Fixnum
class << 1111 ; end
#TypeError: can't define singleton
#       from (irb):4
#       from C:/Ruby200/bin/irb:12:in `<main>'

11.11.class
#=> Float
class << 11.11 ; end
#TypeError: can't define singleton
#       from (irb):6
#       from C:/Ruby200/bin/irb:12:in `<main>'

:name.class
#=> Symbol
class << :name ; end
#TypeError: can't define singleton
#       from (irb):8
#       from C:/Ruby200/bin/irb:12:in `<main>'

【问题讨论】:

  • 你的意思不是“实例对象”,而不是“类对象”吗?顺便说一句,NilClass 的实例对象也允许单例对象。

标签: ruby ruby-2.0


【解决方案1】:

正如Ruby Docs 所说:

对于任何给定的整数值,实际上只有一个 Fixnum 对象实例,因此,例如,您不能将单例方法添加到 Fixnum。

BignumFloatSymbol 也是如此

【讨论】:

  • 但为什么不使用falsetruenil
  • 这是完全错误的:big_fix = 4611686018427387903; big_fix.class #=&gt; Fixnum; big1 = big_fix+1; big1.class #=&gt; Bignum; big2 = big_fix+1; big1.object_id == big2.object_id #=&gt; false 所以可能有 许多 个具有相同值但不同引用的 Bignum。
  • @YoTengoUnLCD 正如您所展示的那样,Bignums 不是这样,但正如文档所说,Fixnums 是这样。 Ruby 已经取消了区分,所以现在它们都是整数。在目前的安排中,具有最多 19 个数字的整数值始终具有相同的对象 id,而较大的则没有。
【解决方案2】:

来自docs

对于任何给定的整数值,实际上只有一个 Fixnum 对象实例,因此,例如,您不能将单例方法添加到 Fixnum。

这将适用于其他原始数字类型和符号。

【讨论】:

    【解决方案3】:

    Singleton class 的定义特征是:它只有一个实例

    • FalseClass 只有一个实例:false
    • TrueClass 只有一个实例:true
    • NilClass 只有一个实例:nil

    这与FloatSymbol 类等不同;这些不是单例。

    虽然对于给定的值这些类只有一个实例

    3.14159.object_id #=> 20565057194439538
    3.14159.object_id #=> 20565057194439538
    3.14159.object_id #=> 20565057194439538
    :hello.object_id  #=> 3551708
    :hello.object_id  #=> 3551708
    :hello.object_id  #=> 3551708
    

    不像,例如,String 类没有这个属性:

    "test".object_id #=> 34347120
    "test".object_id #=> 34388680
    "test".object_id #=> 22397760
    

    请记住,这不是单例的定义。 :foo:barSymbol 的两个不同实例。

    这就是为什么可以在 TrueClassFlaseClassNilClass 上定义 singleton 方法但不能在 Symbol 上定义的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多