2016-04-02 6 views
-3

次の2つのRubyコードとPythonコードは、クラスメソッドの例です。なぜPythonはオブジェクトを通してクラスメソッドにアクセスできますが、ルビはアクセスできません。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

ルビーでは 'puts z.class.foo'を使用できます – knut

答えて

0

あなたの質問のルビー側のための答え:Rubyはクラスのリーダーを経由してオブジェクトを通してクラスのメソッドにアクセスすることができない:

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

ルビードキュメントObject#displayから:指定されたポート(DEFAに

display(port=$>)

プリントobj ult $>)。相当:

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

だから、それだけでStudentインスタンスである受信機が、表示されます。私はこれがクラスメソッドにどのように関連するのか分かりません。クラスメソッドStudent.displayを呼び出す

は実際に可能である:

z.class.display 
+0

私の質問は、私はPythonでオブジェクトを介してクラスメソッドにアクセスすることができますが、ルビーではない –

0

Rubyにはクラスメソッドがなく、インスタンスメソッドのみがあります。あなたの場合、fooは、シングルトンクラスのインスタンスメソッドStudentにあります。

Rubyではインスタンスメソッドのみがクラスメソッドとして存在しないことを理解すれば、まったく異なるインスタンス上でインスタンスを呼び出すことはおそらくうまくいかないことがすぐに分かるはずです。

関連する問題