使用Ruby中的模块的点运算符与范围解析运算符

ord*_*ary 1 ruby module

我怎么能说

Math.sqrt(4)
Run Code Online (Sandbox Code Playgroud)

要么

Math::sqrt(4)
Run Code Online (Sandbox Code Playgroud)

但我不能说

Math.PI
Run Code Online (Sandbox Code Playgroud)

在红宝石

在这种情况下,点运算符正在做什么和结肠运算符之间有什么区别?

Aru*_*hit 7

.是消息传递操作符,::是Ruby中的范围解析操作符.看下面的例子:

module Foo
 X = 12
 def self.bar
   p "hi"
 end
end
Foo::bar # => "hi"
Foo.bar  # => "hi"
Foo::X # => 12
Foo.X
# undefined method `X' for Foo:Module (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

在Ruby中,您可以调用类或模块方法(可以通过类/模块名称本身调用),例如bar使用.::.但是像这样的常量X应该被调用::,但是.不允许.在你的情况下sqrt是模块的类方法Math,而是模块PI的常量Math.