2016-04-02 49 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中只有实例方法没有类方法,那么为什么在一个完全不同的实例上调用一个实例不可能工作,应该立即显而易见。