2010-11-09 89 views
1

您是否可以從名爲Trung.NguyenThe的類創建對象,因爲NguyenThe不是一種方法?我可以在Ruby/Java/C#中創建一個像這樣的對象嗎?

+0

只是一個想法:爲什麼你需要這個嗎?在視覺上,它意味着類型「Trung」中的「NguyenThe」類型。 – Kangkan 2010-11-09 16:52:56

+0

如果「NguyenThe」是一般類「Trung」中的特殊類型,該怎麼辦?對不起所有人,我只是對在課堂上上課感到好奇。 – 2010-11-09 16:55:58

+0

'var x = new {Name =「Trung.NguyenThe」};'? ;) – 2010-11-09 17:10:39

回答

3

在Java C#和Ruby中,您不能在名稱中創建帶有.的變量。

// C# and Java 
Object Trung.NguyenThe = ""; 
# Ruby 
Trung.NguyenThe = "" 

該變量名在所有三種語言中都是非法的。

如果您想要做類似的事情,請使用下劃線_

// C# and Java 
Object Trung_NguyenThe = ""; 
# Ruby 
Trung_NguyenThe = "" 
+0

雅,謝謝你的回答。我知道這樣做是非法的,對於雄心勃勃的問題抱歉。 – 2010-11-09 17:29:54

+0

@Dark,不客氣。你的意思是「模棱兩可的問題」? – jjnguy 2010-11-09 17:30:43

+0

是的,我確定它更清晰。而且,我可以在Ruby課堂上課嗎? (正如下面的人給我看的) – 2010-11-09 17:42:37

1

首先,對象沒有名字。類和變量都可以。

所以我會假設你問有關命名與週期(根據您最後的評論)...

直答案是「不」,而是一個可以模仿使用的命名空間/包或內部類。

命名空間:

namespace Trung { 
    public class NguyenThe {} 
} 

// Usage: 
namespace Whatever { 
    public class Client { 
     public main() { 
      var x = new Trung.NguyenThe(); 
     } 
    } 
} 

內部類:

namespace Whatever { 
    public class Trung { 
     public class NguyenThe {} 
    } 

    // Usage: 
    public class Client { 
     public main() { 
      var x = new Trung.NguyenThe(); 
     } 
    } 
} 

(注:這是C#代碼,但我敢肯定,同樣可以用Java來完成我想Ruby有相同概念也是如此)。

+0

謝謝,這非常有幫助。 – 2010-11-09 17:27:21

+0

你可以在Ruby中做到這一點嗎? – 2010-11-09 17:41:06

+1

@Dark Cloud:(關於Ruby)種。您可以在ruby中定義模塊內部的模塊,但解析模塊成員的ruby語法使用'::'而不是'.'(這在Ruby中是有意義的;模塊就像一個靜態類,您可以使用'.'只解析實例/對象成員)。所以它會成爲'Trung :: NguyenThe()'(或'Trung :: NguyenThe',這在Ruby中是一樣的)。 – rsenna 2010-11-09 21:17:30

0

當然。創建一個名爲Trung的包。在這個包裏面創建一個叫NguyenThe的類。

或者你是否假設Trung已經是班級名稱?

1

在Ruby中,沒有類名稱這樣的東西。類就像每個其他對象一樣,像其他變量一樣分配給變量。

Trung.NguyenThe是不是合法的變量名,因此這是不可能的:

class Object 
    klass = Class.new do 
    def to_s; 'Hello' end 
    end 
    const_set :'Trung.NguyenThe', klass 
    # NameError: wrong constant name Trung.NguyenThe 
end 

可以,當然,創建這是爲了響應NguyenThe消息一個類的對象和對象分配到變量命名Trung,但是這不是你問什麼:

klass = Class.new do 
    def to_s; 'Hello' end 
end 
(Trung = Object.new).define_singleton_method(:NguyenThe) { klass } 

puts Trung.NguyenThe.new 
# Hello 

在C#和Java,在週期類名是非法的爲好。 C#有一個轉義機制,允許您使用其他保留字作爲名稱,但是這種機制不能使用非法名稱,只能使用保留字。

在Java名稱中有更多符號自由的提議,但到目前爲止還沒有實現。

+0

對不起,我不是真正的rubist,但我確實相信Ruby有類名。是的,一個類是一個對象,但這並不意味着它沒有關聯的名稱 - 即使這裏的「name」的概念與靜態語言有點不同......您甚至可以動態獲取通過調用'obj.class.name'來調用任何對象的類名...此外,類名是一個常量,所以它*應該是不可變的。 – rsenna 2010-11-09 21:27:11

+0

'Class#name'只是簡單的調試方法。事實上,它通過掃描所有常量並檢查該類是否已分配給其中的一個並返回該常量的名稱。換句話說:這只是該類所分配的變量的名稱。顯然,這意味着一個類的名字*可以改變,這取決於它被分配給哪個變量:'a = Class.new; p a.name; A = a; p a.name'。 – 2010-11-09 22:25:45

相關問題