【问题标题】:Syntax of a Ruby classRuby 类的语法
【发布时间】:2016-02-12 01:36:50
【问题描述】:

以下 Ruby 类的声明/定义中遵循的格式/语法是什么?我不明白类名中使用的冒号 (:)。这说明什么?

class ::Chef::Recipe
  include ::Opscode::ChefClient::Helpers
end

这是来自here

我熟悉以下定义 Ruby 类的方式:

class ClassName
   CONSTANT = Z
  ....methods...

end

我知道一个常量被称为ClassName::Z,但是上面的声明方式对我来说是新的,我在哪里可以找到像这样声明一个 ruby​​ 类的文档。

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    最初的 :: 表示“即使我们可能在一个类或模块中的词法上,从顶级命名空间定义这个新类”。当您在常量名称的开头使用它时,即使您在另一个模块或类范围内,您引用​​(或创建)的常量也不在该范围内,而是在顶层(这些常量可以通过打印 Object.constants)

    列出

    请注意,“

    【讨论】:

    • 能否详细说明一下:The initial :: says "even though we might be lexically inside a class or module, define this new class from the top level namespace".
    • 遇到了这个chef.io/blog/2013/09/04/…。它说:“在某些食谱中,您可能会看到 ::File 用于引用 Ruby File 类。为什么不只是“File”?原因是因为 Chef 有自己的名为 File 的类。具体来说,有资源和 Chef 中称为 File 的提供程序类。为了避免歧义——歧义会导致错误——每当我们想要引用 Ruby 的 File 类时,我们使用 ::File。“根据你的回答和这个博客,ruby 是否有另一个类叫做 `chef '?
    • @OK9999 在编写 Chef 菜谱时,您处于 Chef::Recipe 的实例中,用于 DSL 以及纯 ruby​​ 代码。这就是为什么你需要避免 DSL 方法和纯 Ruby 方法之间的歧义
    【解决方案2】:
    module Foo
      class Bar
      end
    
      class ::Baz
      end
    end
    

    定义Foo::BarBaz(不是Foo::Baz)。

    类似于目录的工作方式:假设存在/foo,当前目录为/

    cd foo
    mkdir bar
    mkdir /baz
    

    创建/foo/bar/baz(不是/foo/baz)。

    【讨论】:

    • 所以 Baz 类 - 不在 Foo 模块命名空间内?
    • 是的。在您的问题中,OpsCode 不在Recipe 内。
    【解决方案3】:

    下面是如何查找常量的示例:

    A = 1
    
    module X
      A = 'hello'
    
      class Y
        A = [1, 2, 3]
    
        def show
          p A
          p ::A
        end
      end
    
    end
    
    X::Y.new.show
    
    --output:--
    [1, 2, 3]
    1
    

    【讨论】:

    • 你能实例化一个模块吗?我遇到过许多文档说无法实例化模块。这是一个这样的链接:stackoverflow.com/questions/151505/… 或者,我们可以实例化一个存在于模块中的类,就像你所做的那样。 ` X::Y.new.show` ...我可以使用 irb 来测试您的示例
    • 你不能实例化一个模块。您可以使用类似于单例类的模块(通过直接调用它定义的方法),或者您可以将模块作为 mixin 包含到类中(然后实例化该类)。
    • OK999, X::Y 是一个类,您可以在其上调用 new()。模块可以用作命名空间,这里就是这种情况。使用命名空间以便不会发生名称冲突。如果其他开发人员实现了一个名为 Y 的类,他将在他唯一的命名空间名称中定义它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多