2016-03-07 115 views
1

所有事情都是Ruby中的一個對象。所以如果我們有一個類Hello這是一個父類Object的實例。Ruby中的繼承

如果我在Ruby中的情況如下:

Hello = Class.new 
World = Class.new(Hello) 

這是否轉化爲以下?

class Hello 
class World < Hello 

由於多重繼承無法在Ruby中進行,該new方法應該只有一個參數?

+0

大部分事情在Ruby中是對象,但有很多例外。例子包括塊,'if'子句,不作爲方法實現的運算符,循環和變量(它們本身,而不是它們的值)。 –

回答

4

是的。對兩者都是正面的(除了你的後面的代碼是無效的)。

請注意,您的「Hello它是父類Class的一個實例。」是錯的。 HelloClass的一個實例,但其父項不是Class,它是Object

2

是的,沒有。是的,因爲就像你寫的那樣,最終會得到相同的結果(假設你會添加缺少的ends)。不,因爲一般情況下的差異很小。內Class.new定義什麼,你需要傳遞一個紅寶石塊,其中攜帶,並擁有完全訪問,它在被創建的上下文這樣:

value = :hello 

Hello = Class.new do 
    define_method value do 
    value 
    end 
end 

Hello.new.hello #=> :hello 
value = :world 
Hello.new.hello #=> :world 

注意,方法的名稱做了不變。但是,它返回的價值確實如此。這並不理想,並且爲什麼class Hello在大多數情況下都是首選,以避免誤操作(與def關鍵字相比優先於define_method)。

這不會class關鍵字的工作,因爲它不會產生紅寶石塊:類和常量

class Hello2 
    define_method value do 
    value 
    end 
end 

#=> undefined local variable or method `value` 

還有一個有趣的事實是name方法的行爲:

my_variable = Class.new 
my_variable.name #=> nil 

Hello = my_variable 
my_variable.name #=> "Hello" 

World = my_variable 
my_variable.name #=> "Hello"