2016-04-02 3 views
-3

Следующие два кода Ruby и Python являются примерами методов класса. Почему python разрешает доступ к методам класса через объекты, но рубин не работает?Методы класса Python vs 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

thanks..solved it .. –

0

рубиновых документ Object#display:

display(port=$>)

распечаток obj по данному порту (DEFA ult $>). Эквивалент:

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

Так он просто показывает приемник, который представляет собой Student экземпляр. Я не вижу, как это относится к методам класса.

Вызов метода класса Student.display действительно возможен:

z.class.display 
+0

мой вопрос, почему я могу получить доступ к методам класса через объекты в python, но не в ruby ​​ –

0

Ruby не имеет методов класса, только методы экземпляра. В вашем случае foo является, например, методом одноэлементного класса Student.

Как только вы понимаете, что в Ruby не существует такой вещи, как метод класса, только методы экземпляра, должно быть сразу очевидно, почему вызов экземпляра на совершенно другом экземпляре не может работать.

Смежные вопросы