2016-04-02 53 views
-3

以下兩個Ruby和Python代碼是類方法的示例。爲什麼python允許通過對象訪問類方法,但Ruby不會呢?Python與Ruby類方法

Python代碼

class student: 
    b = 78 

    @classmethod 
    def foo(var): 
     return var.b 

z = student() 
print z.foo() # => 78 

紅寶石代碼

class Student 
    @@b = 78 

    def self.foo 
    @@b 
    end 
end 

z = Student.new 
puts z.foo # => -e:20:in `<main>': undefined method `foo' for #<Student:0x007ff4f98ab9e8> (NoMethodError) 
+4

你的問題歸結爲「爲什麼不同的語言實際上是不同的?」因爲他們是不同的語言...? – kindall

+0

@kindall其實我只想知道是否有特定的原因 –

+0

在ruby中,你可以使用'puts z.class.foo' – knut

回答

0

你的問題的紅寶石側的回答:紅寶石確實允許通過一個閱讀器通過對象訪問該類類方法:

class Student 
    @@b = 78 

    def self.foo 
    @@b 
    end 
end 

z = Student.new 
puts z.class.foo 

z.class返回對象的類(在本例中爲Student)。

class Student 
end 
z = Student.new 
puts z.class  #Student 
puts z.class.class #Class 
+0

謝謝..解壓縮.. –

0

從紅寶石DOC Object#display:給定端口上

display(port=$>)

打印obj(帝發ult $>)。等效於:

def display(port=$>) 
    port.write self 
end 

所以它只是顯示的接收器,這是一個Student實例。我不明白這是如何與類方法相關的。

調用類方法Student.display其實可能:

z.class.display 
+0

我的問題是,爲什麼我能夠通過python中的對象訪問類方法,但不能在ruby –

0

Ruby沒有類方法,只有實例方法。在你的情況下,foo是在單例類Student的實例方法。

一旦你明白在Ruby中只有實例方法沒有類方法,那麼爲什麼在一個完全不同的實例上調用一個實例不可能工作,應該立即顯而易見。