module Foo class Bar; end class ::FooBar def self.method1 "method1" end end end
Foo::Bar FooBar FooBar::method1 => "method1"
那一般的方法用 . 来调用只是个人喜好或约定?
.
双冒号是定义 name space 用的,或者叫 scope
当你使用 Foo::Bar 的时候,实际你是在找一个名字叫 Foo 的 namespace,然后让它返回它里面的 Bar 参数,这个 Bar 可以是个常量,可以是个类,可以是个方法(后两者在 Ruby 中可视为常量)
Foo::Bar
Foo
Bar
同理使用 FooBar::method1 的时候实际上是在要求返回 FooBar 这个 namespace 中 method1 这个「常量」的值。
FooBar::method1
FooBar
method1
使用 FooBar.method1 的时候则是在调用这个方法,当然返回结果是一样的,这里 :: 和 . 确实是可以互换不影响结果。但 :: 只能用来找 class method , instance method 就只能用 . 了
FooBar.method1
::
另外 :: 还能用来找真正的常量,比方这样
class Foo Bar = "hello" bar = "hello" end ========= Foo::Bar # => "hello" Foo::bar # => 出错 Foo.Bar # => 出错 Foo.bar # => 出错
另外 :: 在开始位置则表示回到 root namespace,就是不管前面套了几个 Module,都算你其实写在最外层。
#1 楼 @blacktulip 可能你没看明白问题把。 问题的例子中已经列出了所有的功能,其实类名也是一个常量 我问的是 "个人喜好或约定?"
class Foo def bar ; end end Foo::new::bar
没什么硬性约定,一般为了保持一致性,call method 统一用 . ,让人一看就知道是 method call
综上所述 如果 Foo::小写 (new,test)---->就去需找方法 如果 Foo::大写 (A,VERSION)--->就去寻找常量
#1 楼 @blacktulip 你好!下面的 ::File 就是表示回到 root namespace 的意思么?
::File
def existing_git_clone? ::File.exist?(::File.join(@new_resource.destination, ".git")) end def target_dir_non_existent_or_empty? !::File.exist?(@new_resource.destination) || Dir.entries(@new_resource.destination).sort == ['.','..'] end
完整的代码在 这里 。
已经在 这里 找到答案,希望没有打扰到你,不好意思!
# coding: utf-8 class Mao PPP='aaaaa' def ppp puts "maohaofu" end end def maomao puts ::Mao.new::ppp puts ::Mao:: new::ppp # 和上一行一样效果 puts ::Mao::PPP end maomao()
这样会不会明白些
输出
maohaofu maohaofu aaaaa
clear