2015-10-20 44 views
0

C++社區最大的罪行之一是writing using namespace xyz instead of writing the namespace out everywhere in the code爲什麼Ruby不像C++那樣具有相同的命名空間控制?

Ruby通過模塊具有與命名空間相同的功能。所有關於在C++中使用完整名稱空間的建議問題都適用於在Ruby中包含整個模塊。但是在Ruby中,並不是要這樣做。

那麼,爲什麼Ruby沒有與C++相同的命名空間控制?在Ruby中包含模塊和在C++中使用namspace有什麼區別?

+0

推測模塊的內容是明確定義的,而C++名稱空間的內容不是。但可能有一個強大的文化組成部分。也許在某些情況下,如果代碼不能完成你認爲正在做的事情,那麼它並不重要。 – juanchopanza

+0

爲什麼近距離投票?這個問題聽起來像一個意見?我不是在尋找意見。我想知道有什麼不同。爲什麼Ruby不具有相同的問題? –

回答

3

有一種強烈的文化組成部分這一點,因爲它是完全有效導入整個命名空間......

C++有參數依賴查找(ADL )和紅寶石沒有。隨着程序的發展,一個無辜的using namespace x會越來越有可能意外地改變整個程序的含義,因爲編譯器碰巧找到了名稱空間中x::命名空間中的一個更好的匹配,該函數具有相同的名稱和類似的簽名一個在(例如)y::命名空間中。

這是在這個問題上謹慎的原因。

2

當你混合時,你通常會「包含」一個模塊 - 從一個模塊到另一個模塊的功能。混合插入和繼承之間有一些相似之處,您可以將「模塊/類」的功能「吸收」到當前模塊/類中。這是a comparison of the two

但是,如果您不是混入功能,那麼您總是會使用模塊的適當名稱空間限定符來訪問其功能。

+0

因此,如果模塊A包含模塊B用於自己的目的,然後將模塊A包含在我的程序中,那麼模塊B將不會包含在我的代碼範圍內?而在命名空間的C++中,它會是? –

+0

它將包含在範圍內。你已經有效地將B混合到A中,所以它不會改變你從哪裏訪問它。但是如果你想訪問模塊A中的函數,你仍然可以使用完整的命名空間限定符:'A.foo()','A.bar()'等'include'只是將B合併/混合成A 。 –

0

您通常不會通過頂層包含所有內容(相當於在C++中使用名稱空間)。你將它「混合」在你需要那個特定模塊的功能的地方。

相關問題