ruby - Ruby:BigDecimal:同时是一个类和一个方法?
问题描述
require bigdecimal
BigDecimal.class # => Class
所以,BigDecimal
是一堂课。
但同时,BigDecimal
可以像方法一样调用:
BigDecimal("42.0") # => 0.42e2
其背后的机制是什么?我怎么能看到它BigDecimal
是可调用的?我怎样才能让我自己的类常量可调用?
解决方案
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 变得自然,而不是简单。红宝石外表简单,内心却很复杂,就像我们的人体一样。
推荐阅读
- laravel - Laravel:选择性下拉列表
- r - 如何将点与R中的绘图线连接起来
- firebase - 使用 Firebase 时如何解决空指针异常
- python - 将 Excel 转换为 Google 电子表格
- python - Kornia 旋转不像预期的那样旋转
- oracle-apex - Oracle Apex 中具有动态操作的单个按钮上的多个条件
- python - 如何在 sklearn 上“真正计算”随机森林特征重要性?
- ansible - 创建 ansible playbook 来安装 vnc
- python - 在云服务器中运行交互式代理客户端门户 API
- xml - (递归)所有深度级别元素的自动增量并保持链中的遗传路径