2014-05-15 3 views
1

나는 인트로 스펙 션으로 놀고 있으며 런타임에 인수 개수와 인수 이름을 추출하려고합니다. 이런 식으로 구현할 수 있을까요?루비 메서드 인트로시

class Greeter 
    def self.greet(name, weekday = "Friday") 
    "Hello #{name}. Today is #{weekday}" 
    end 

    def self.splatter(*arguments) 
    arguments.join("|") 
    end 
end 

Greeter.argument_count(:greet) 
=> 1..2 

Greeter.argument_names(:greet) 
=> [:name, :weekday] 

Greeter.argument_count(:splatter) 
=> [0..Infinity] 

나는 인수의 이름을 검색하는 방법에 대한 아무 생각이 없습니다.

그러나 난수를 무작위로 넘겨이 메서드를 의도적으로 호출하여 ArgumentError을 트리거 한 다음 예외 메시지에서 허용되는 인수 개수를 추출하여 인수 개수를 추출 할 수있었습니다. 그러나 이것은 위험하며 스 플랫 메서드 서명에는 작동하지 않습니다.

답변

3

이러한 것들을위한 형식이 있습니다. 필요에 맞게 다음을 수정할 수 있습니다.

class Object 
    def argument_count m; method(m).arity end 
    def argument_names m; method(m).parameters end 
end 

Greeter.argument_count(:greet) # => -2 
Greeter.argument_names(:greet) # => [[:req, :name], [:opt, :weekday]] 
+0

arity''의 결과는 해석하기 조금 어려울 수 있습니다 - [방법] (http://www.ruby-doc.org/core-2.1.2/에 rubydoc 페이지를 살펴 Method.html # method-i-arity)에 대한 설명이 나와 있습니다. –