예, 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
개체가 직접에 응답하는 방법 사이의 구별, 그리고 그것의 인스턴스를 제공하는는 methods
및 instance_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
자체를 전달합니다. 파이썬에서는 관용적이지만 루비에서는 극히 형편없는 스타일로 간주됩니다.
본질적으로 다른 언어로, 비록 여러면에서 유사하지만 특정 문제를 해결하는 방법이 다르며 좋은 연습이나 스타일로 간주되는 일부 사항은 다른 그 반대의 경우도 마찬가지입니다.