2013-05-14 47 views
0

是否有理由在Ruby模塊中不使用@var或@@ var,而不是將其用作類中的混合模塊?我已經嘗試過了,兩個變量的結果都是相同的(簡單的模塊基本上是一個@var或@@ var的getter和setter)。我還沒有找到一個例子或解釋說,一個模塊可以使用一些可變的狀態。它幾乎可以在java中用作單例。Ruby:Ruby模塊中的@@ var或@var?

我發現了一段全部使用@@ vars的代碼,它從來沒有在任何其他類中包含/擴展 - 所以基本上開發人員使用該模塊來保存某些可能會更新的狀態,但希望所有消費者的模塊在任何給定的時間看到相同的狀態,我想我可以看到一些情況下,這將是有價值的,但因爲我從來沒有見過任何記錄的情況下,我發現它很奇怪。

無論如何,在模塊上下文中,實例@var與'class'@@ var是否有區別?

編輯:

所以我嘗試了更多。所以我上面的問題是假設沒有使用mixin。這基本上說,有一個類變量的所有.....模塊的一個實例(有點像一個單身人士),或者你有一個實例變量共享所有...模塊的一個實例,所以使用爲相同的行爲狀態結果。然而,我做了一個實例方法,它基本上是一個實例getter,與我的模塊方法getter一起,並在類中進行了混合。在@@ var的情況下,單個模塊實例和所有類共享它設置的值。使用@var,單個「模塊實例」擁有自己的值,然後每個爲mixin實例方法設置@var的類實例都擁有自己的@var。

我想這是有道理的。

回答

0

如果模塊沒有包含在類中,我不認爲有任何區別。一個類的實例變量和類變量之間的差異是:

  • 類變量在子類中共享。如果AB一個子類,那麼A@@foo是相同的對象的B@@foo,但A@foo是從B@foo不同。
  • 類變量在類及其所有實例之間共享。如果abA實例,則的A@@foo是相同的對象的a@@foob@@foo,但A@foo,的a@foo,以及b@foo是不同影響。

這兩個都與未包含在類中的模塊無關。

但是由於類變量的使用可能意味着在子類和/或類和/或其實例之間存在這樣的共享,爲了清楚起見,使用類的實例變量可能更好,而不是一個類變量。

+1

Downvoter,評論?我看不出這個答案沒有錯。 – fotanus 2013-05-14 11:38:43

+1

@fotanus感謝您的評論。 – sawa 2013-05-14 11:53:44