2017-10-03 2 views
2

파이썬에서는 __len__ 메서드를 호출하여 list의 길이를 얻을 수 있습니다. __len__은 각 개체 list에 정의되어 있지 않지만 클래스 list에 정의되어 있습니다. Array.length를 사용하는 경우 루비에서 'Array.length`가 NoMethodError를주는 이유는 무엇입니까?

> [].length 
=> 0 
> [].class 
=> Array 
> Array.length([]) 
NoMethodError: undefined method `length' for Array:Class 

가 왜 length 방법을 찾을 수 없습니다 :

>>> [].__len__() 
0 
>>> type([]) 
<class 'list'> 
>>> list.__len__([]) 
0 

는 그러나, 해당 코드는 루비에서 작동하지 않습니다 방법은 클래스를 통해 직접 액세스 할 수 있습니까? Ruby에서 메소드 조회가 파이썬과 다르게 작동합니까?

답변

6

예, Ruby의 메소드 검색은 Python의 메소드 검색과는 조금 다르게 작동합니다.

TL : DR 대답은 Array 클래스 개체에서 length 메서드를 실제로 가져 오려면 Array.instance_method(:length)으로 작성해야합니다.

unbound_method = Array.instance_method(:length) 
ary = [1,2,3,4] 
bound_method = unbound_method.bind(ary) 
bound_method.call #=> 4 

당연히, 이것은 일반적으로 루비에서 수행되지 않은 :이 당신이 다음 특정 개체에 결합하여 전화를 수있는 UnboundMethod 개체를 얻을 것입니다.

루비에서 클래스 자체는 객체이며, 클래스 Class의 인스턴스입니다. 이러한 클래스는 위가 등 물론 new, name, superclass, 그들의 경우, 방법 제공 방법을 넘어, 자신의 방법을 가지고, 그것은 당신 때문에 Array 클래스 객체에 length 방법을 정의하는 것 Array.length을 작성할 수 있지만, 이것은 본질적으로 같은 이름의 인스턴스 메소드와 관련이 없습니다. 핵심 클래스와 표준 라이브러리에는 실제로이 작업이 수행되는 곳이 몇 개 있지만, 대부분 루비에서는 관용적이지 않습니다.

다음은 Class 개체가 직접에 응답하는 방법 사이의 구별, 그리고 그것의 인스턴스를 제공하는는 methodsinstance_methods 방법의 출력에 꽤 명확하게 볼 수 있습니다 :

irb(main):001:0> Array.methods 
=> [:[], :try_convert, :new, :allocate, :superclass, ... 
irb(main):002:0> Array.instance_methods 
=> [:each_index, :join, :rotate, :rotate!, :sort!, ... 

이유 중 하나는 그 Ruby에서 메소드 룩업은 파이썬에서와 같은 방식으로 작동하지 않습니다. 클래스와 인스턴스가 응답해야하는 메소드 이름이 여러 가지 일 수 있습니다.

파이썬에서
Person.ancestors # => [Person, Animal, Organism, Object, Kernel, BasicObject] 
john = Person.new(...) 
john.ancestors # => [John Sr., Sally, Jospeh, Mary, Charles, Jessica] 

은 물론, 첫 번째 호출 오류 다음과 같습니다 : 예를 들어, 가상의 Person 클래스를 고려하면 __self__을 할 Person의 인스턴스를 통과하지 않고 Person.ancestors를 호출 할 수 없습니다, 즉 않을 것 어떤 의미가 있습니다. 그렇다면 Person 클래스의 조상을 어떻게 얻습니까? 함수 inspect.getmro(Person)Person 자체를 전달합니다. 파이썬에서는 관용적이지만 루비에서는 극히 형편없는 스타일로 간주됩니다.

본질적으로 다른 언어로, 비록 여러면에서 유사하지만 특정 문제를 해결하는 방법이 다르며 좋은 연습이나 스타일로 간주되는 일부 사항은 다른 그 반대의 경우도 마찬가지입니다.

관련 문제