【问题标题】:Ruby: BigDecimal: a class and a method at the same time? [duplicate]Ruby:BigDecimal:同时是一个类和一个方法? [复制]
【发布时间】:2019-04-21 00:21:45
【问题描述】:
require bigdecimal
BigDecimal.class     # => Class

所以,BigDecimal 是一个类。

但同时,BigDecimal 可以像方法一样被调用:

BigDecimal("42.0")   # => 0.42e2

它背后的机制是什么?我怎样才能看到 BigDecimal 是可调用的?以及如何使我自己的类常量可调用?

【问题讨论】:

    标签: ruby class methods callable


    【解决方案1】:

    BigDecimal 是一个类,但它也是Kernel 模块中定义的一个方法。

    内核中定义的方法不必调用接收器,因为Kernel 模块与Object 类混合使用。

    From the docs: Kernel 模块包含在 Object 类中,因此它的方法在每个 Ruby 对象中都可用。

    Ruby 知道 Array.newArray(1) 是不同的东西,因为常量 (classes and modules are constants) 不接收参数。

    class Abc
    end
    
    def Abc
      puts 'Method called'
    end
    
    Abc()
    #=> Method called
    
    Abc
    #=> Abc (Class)
    

    正如Matz曾经说过的:

    我试图让 Ruby 变得自然,而不是简单。红宝石外表简单,内心却很复杂,就像我们的人体一样。

    【讨论】:

    • 所以,通过尝试method(:BigDecimal) # => #<Method: main.BigDecimal>,我可以看到有一个方法BigDecimal(除了类BigDecimal)。
    猜你喜欢
    • 2011-02-05
    • 2013-04-20
    • 2012-03-06
    • 2021-11-28
    • 1970-01-01
    • 2021-03-25
    • 2012-07-29
    • 2015-06-15
    • 1970-01-01
    相关资源
    最近更新 更多