2009-11-10 3 views
2

이 코드가 주어 졌을 때 :Ruby에서 호출에 사용 된 인수가 포함 된 메소드에 대한 참조를 얻으려면 어떻게해야합니까?

a = {1=>2} 
m = a.method(:[]) 

이제 2를 반환 할 것입니다. 무엇을 변경해야하므로 메서드를 호출 할 수 있습니까? 직접적으로 좋아해요 :

m.call() 

그러면 1이 매개 변수로 전송됩니까? 다음과 같은 것을 쓸 수 있으면 좋을 것입니다 :

m = a.method(:[],1) # where the symbol is the method, and 1 will be the parameter it will be called with 

문제는 어떤 객체가 생성 될 때까지 스크립트의 특정 부분의 실행을 지연시키고 싶습니다. 람다를 사용하기 위해 모든 것을 다시 쓰는 것.

답변

3

기본적으로 원하는 것은 기능을 카레 만드는 방법입니다.

http://en.wikipedia.org/wiki/Curry_function

이이 중 하나가, 여러 가지 방법으로 수행 할 수 있습니다

def curry(method, *params) 
    lambda { send method, *params } 
end 

당신은 해시의 메타 클래스에이를 추가 할 수 있습니다, 또는 모듈에 당신은 당신의 객체의 일부에 포함 할 그런 다음 전화하면 원하는 용도가됩니다.

irb(main):001:0> a = {1 => 2} 
=> {1=>2} 
... # add curry to Hash's metaclass 
irb(main):011:0> m = a.curry :[], 1 
=> #<Proc:[email protected](irb):8> 
irb(main):012:0> m.call 
=> 2 
+0

이것이 이미'Object'의 일부라면 좋았을 것입니다. – Geo

3

여러 가지 방법이 있습니다.

a = {1=>2} 

class << a 
    def fetch_what(key) 
    Proc.new { self[key] } 
    end 
end 

.... 

m = a.fetch_what(1) 
m.call() # -> 2 
+0

이것은 꽤 깔끔합니다. 다른 방법이 있는지 궁금합니다. – Geo

0

메서드를 호출하는 개체에 메서드 매개 변수를 첨부하고 메서드에서 인스턴스 변수로 액세스해야하는 것처럼 들립니다. 간단한 리팩토링 단계의 관점에서

:

  • 도입하는 새로운 인스턴스 변수, 메소드 파라미터 하나씩.
  • 인스턴스 변수에 대한 새로운 접근자를 소개합니다.
  • 매개 변수가 제공되지 않은 경우 인스턴스 변수를 사용하는 방법을 리팩터링하십시오.
  • 메서드 호출 전 어느 시점에서 접근자를 통해 인스턴스 변수를 설정하는 호출 코드를 리 팩터합니다.
  • 메서드 호출시 매개 변수를 전달하지 않는 호출 코드를 리 팩터합니다. 그것은 섹시하거나 영리 아니다

     
    widget = Widget.new 
    widget.frombulator = :electric 
    widget.jazzifier = :smooth 
    assembly_method = widget.method(:assemble) 
    # Time passes... 
    assembly_method.call 
    

    을하지만, 그 의도를 표현하는 코드가 발생합니다 : 예를 들어

,이 같은 리팩토링 호출 코드 :

 
widget = Widget.new 
assembly_method = widget.method(:assemble) 
# Time passes... 
assembly_method.call(:electric, :smooth) 

은 다음과 같이 작동합니다 실제로 문제를 해결할 확률이 높습니다. 즉, 귀하의 모델에서 무엇인가가 빠져 있다는 것입니다.

+0

나는 그것을 게으 르기를 원한다. 이 방법은 호출 될 때, 내가 찾고있는 값이 존재합니다. – Geo

+0

예. 그게 제가 제안하는 것입니다. – sheldonh

관련 문제