2011-12-20 75 views
3

有沒有辦法讓我們在一個類的方法創建一個特定的類的實例的名稱?獲得實例名

這就是我想要做的事:

module MyObjectStore 
    values = {} 
    temp= {} 
    define_method :add_check_attribute do |method,*args| 
    if method.to_s =~ /=$/ 
     temp[method[0..-2]] = args[0] 
    else 
     instance_variable_get("@#{method}") 
    end 
    end 
    define_method :method_missing do |method,*args| 
    add_check_attribute(method,*args) 
    end 
    define_method :save do 
    temp.each {|key,value| instance_variable_set("@#{key}",value)} 
    values[self] = temp 
    end 
end 

class C 
    include MyObjectStore 
end 

a = C.new 
a.id = 1 
a.name = 'gaurav' 
a.save 

在模塊的第三到最後一行,我試圖對象的值存儲到具有新的散列實例名稱爲關鍵。

就像是可能的東西嗎?

我使用self現在,但它給整個對象,而不是實例名。

回答

6

Ruby對象除了有一個內存地址沒有名字。但是,每個對象都有一個始終唯一的object_id。使用ObjectSpace._id2ref,實例和ID是可以互換的。 下面是一個例子:

id="Hello, World".object_id => 82609910 
ObjectSpace._id2ref(id)  => "Hello, World" 
"Hello, Ruby".object_id  => 82721540 

值得一提的是,對象ID,雖然常數在其生命週期的對象,它是一個程序的運行,並且有相同的數據不同對象之間幾乎從來不變將具有不同的ID:

"Hi".object_id     => 82719050 
"Hi".object_id     => 82715090 

對象ID也運行依賴和取決於操作系統等。切勿硬編碼對象ID添加到您的源代碼,只使用您通過object_id了IDS。

+0

偉大的人, 這正是我一直在尋找的。萬分感謝!! – 2011-12-21 05:30:27

+0

當然。很高興我能幫上忙。 – Linuxios 2011-12-21 15:03:51

2

實例名稱應該是什麼?除非你正在談論一個特定的屬性(如name),否則一個實例並沒有真正的名字。它可以通過變量有一個名字引用,但兩者是不同的。

所以:

  • 的對象不具有一個「名」,除了被用來解釋一些內存手柄或類似的機制。
  • 變量具有名稱,但可以在程序執行期間引用不同的實例。
  • 不同的變量可能指向同一個實例。

鑑於最後一點,實例如何決定「名稱」?要解決這個問題

一個方法是爲使用的內存地址或某種散列函數作爲對象名稱。哈希函數有點棘手,因爲它會隨着對象的變化而變化。

您也可以決定在所有實例上使用idname字段並使用該字段。保持獨特。保證有樂趣。發瘋。回來開悟。教我們。

+0

就像在上面的代碼中,我有** a **作爲類C的一個實例。 我想使用這個值「a」作爲哈希鍵。 – 2011-12-20 10:37:30

+0

@Gaurav Manchanda'a'不是它引用'C'類的實例。 – Howard 2011-12-20 10:39:45

+0

@GauravManchanda,你想要做hsh.merge({a.name => a}),那麼你將有一個指向該對象的name屬性的對象a! – 2011-12-20 10:44:24