首页 > 解决方案 > Ruby:BigDecimal:同时是一个类和一个方法?

问题描述

require bigdecimal
BigDecimal.class     # => Class

所以,BigDecimal是一堂课。

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

BigDecimal("42.0")   # => 0.42e2

其背后的机制是什么?我怎么能看到它BigDecimal是可调用的?我怎样才能让我自己的类常量可调用?

标签: rubyclassmethodscallable

解决方案


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

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

来自文档:内核模块包含在类 Object 中,因此它的方法在每个 Ruby 对象中都可用。

Ruby 知道Array.new并且Array(1)是不同的东西,因为常量(类和模块是常量)不接收参数。

class Abc
end

def Abc
  puts 'Method called'
end

Abc()
#=> Method called

Abc
#=> Abc (Class)

正如马茨曾经说过的:

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


推荐阅读