2015-11-11 67 views
0

下面的Ruby類的聲明/定義中遵循的格式/語法是什麼?我不明白類名中使用的冒號(:)。這是什麼意思?Ruby類的語法

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

這是here

我所熟悉的定義Ruby類的以下方式:

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

end 

而且我知道一個常數稱爲類似ClassName::Z,但上面的聲明的方式對我來說是新的,我在哪裏可以找到有關如何聲明Ruby類的文檔。

回答

3
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)。

+0

所以'Baz'類不在'Foo'模塊名稱空間內? – OK999

+0

是的。在你的問題中,'OpsCode'不在'Recipe'裏面。 – Amadan

6

初始::表示「即使我們可能在詞類或模塊的詞法上,從頂級命名空間定義這個新類」。當你在一個常量名的開頭使用它時,即使你在另一個模塊或類作用域內,你引用的(或創建的)常量不在該作用域內,而是處於最高級別(這些常量可以通過打印Object.constants

注意,下面的「<」(用於超文本)可以是,它返回一類對象(在編譯時計算的)的任何表達式中列出。你甚至可以使用一個函數來返回超類。

+0

能否請您詳細說明這一點:'最初::說,「即使我們可能是詞法類或模塊內,定義這個來自頂級命名空間的新類「。」 – OK999

+0

遇到此https://www.chef.io/blog/2013/09/04/demystifying-common-idioms-in-chef-recipes/。它說:「在一些食譜中,你可能會看到:: File用於引用Ruby File類,爲什麼它不是」File「? 原因是因爲Chef有它自己的名爲File的類。是Chef中稱爲File的資源和提供者類。爲了避免歧義 - 模糊導致錯誤 - 每當我們想引用Ruby的File類時,我們使用:: File。「根據你的回答和這個博客,ruby是否有另一個類調用'廚師'? – OK999

+0

@ OK9999在寫一個廚師食譜時,你會在純粹的Ruby代碼中使用DSL的'Chef :: Recipe'實例。這就是爲什麼你需要避免DSL方法和純Ruby方法之間的歧義 – Tensibai

1

而且,這裏是如何常量擡頭的一個例子:

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 
+0

你可以實例化一個模塊嗎?我遇到過很多文檔說模塊不能實例化。這是一個這樣的鏈接:http://stackoverflow.com/questions/151505/difference-between-a-class-and-a-module或者,是這樣的,我們可以實例化一個類存在於模塊內部,就像你完成了。 ' X :: Y.new.show' ...我可以使用irb來測試你的例子 – OK999

+0

你不能實例化一個模塊。你可以使用一個類似於單例類的模塊類型(通過直接調用它定義的方法),或者你可以將一個模塊作爲一個mixin包含在類中(並且實例化該類)。 – Amadan

+0

OK999,'X :: Y'是一個類,你可以調用new()。模塊可以用作* namespaces *,在這裏就是這種情況。命名空間被用來避免名稱衝突。如果其他開發人員實現了一個名爲Y的類,他將在其唯一的名稱空間名稱中定義它。 – 7stud