2012-06-28 3 views
1

는 최근에 나는이 방법을 내놓았다했습니다이 루비 방법과 비슷한가요?

module Enumerable 
    def transform 
    yield self 
    end 
end 

방법의 목적은 tap 방법 만 개체를 ​​수정하는 기능과 유사하다.

이 방법으로 예를 들어 I 체인 스타일의 배열 순서를 변경할 수 있습니다 :

array.do_something.transform{ |a| [a[3],a[0],a[1],a[2]] }.do_something_else 

를 대신이 일을 :하지만이 방법을 사용하는 경우

a0,a1,a2,a3 = array.do_something 
result = [a3, a0, a1, a2].do_something_else 

는 또 다른 편의 시설이 있습니다. ..

이 메서드는 매우 간단하므로 어딘가에 같은 목적으로 이미 작성된 메서드 여야합니다.

이 루비 방법과 유사합니까?

+0

예. Object # tap self를 반환하지만 1.9부터 제공됩니다. – texasbruce

+0

내 버전은 yield self의 결과, 즉 self가 아닌 block의 결과를 반환합니다. – megas

+0

수정 : 귀하의 방법에있는 자기 자신에게 양보하십시오. 당신도 자기를 돌려주고 싶다는 언급은하지 않았으므로 블록을 반환 할 이유가 있습니다. – texasbruce

답변

1

수행 할 수있는 그 instance_eval와 : 상기 수신기의 맥락

를 평가합니다 (...) 지정된 블록

예 :

%w(a b c d).instance_eval{|a| [a[3], a[0], a[1], a[2]] } 
# => ["d", "a", "b", "c"] 

또는 self 사용 :

%w(a b c d).instance_eval{ [self[3], self[0], self[1], self[2]] } 
# => ["d", "a", "b", "c"] 
+0

예, 내 버전과 매우 비슷하지만 버전은 2.2 시간 후에 더 느립니다. – megas

1

지금이 테스트 할 수 있지만이 같은 것을 할 수 있어야한다 :

array= [1,2,3] 
array.tap{ |a| a.clear } 

탭을 사용하면 블록 자체를 수정할 수 있습니다 그래서 만약 블록이 다음 자체를 반환 실행을, 그것은 다시 전달합니다 갱신 된 배열 내 예제에서는 clear를 사용하여 블록에서 자기를 수정하므로 수정 된 자체가 반환됩니다.

이 기능을 사용하려면 do_something_else와 같은 메소드를 추가하는 것이 좋습니다. 자기를 수정 한 다음 탭 블록 내에서 실행합니다.

+0

이런 종류의 경우,'tap'을'instance_eval'로 대체하고'self'를 사용할 수 있습니다. 원래의 변수를 변경하지 않고 복사본을 반환 할 수 있습니다. – tlehman

0

그렇다면 질문은 어디에 있습니까? 그것은 모두 당신이 함수 프로그래밍 영역으로 가고 싶은지에 달려 있습니다. 그냥 Learn You a Haskell for Great Good!을 읽고 당신은 결코 같지 않을 것입니다. 이 판도라 상자를 열면 정말 멈추기가 어렵습니다. 그리고 실험을 한 후에도 Ruby 코드를 작성하고 있는지 궁금합니다. 비교 당신이 변환의 관점에서 사물을 생각하려면

h = {} 
{:a => :a_method, :b => :b_method}.each do |k, m| 
    h[k] = some_object.__send__(m) 
end 
h.some_other_method 

some_object.transform(&THash[:a => :a_method, :b => :b_method]).some_other_method 

THash = 
    lambda do |t| 
    h = {} 
    kms = t.map { |k, v| [k, v.to_proc] } 
    lambda do |x| 
     kms.each { |k, m| h[k] = m[x] } 
    end 
    end 

그래서, 완벽하게 (Object에 대해 정의 당신의 transform 방법을 사용하여) 감각을 느끼고 코드를보다 읽기 쉽게 만들지 만, 단지 transform 메소드 이상이면 자주 사용하는 일반적인 변환을 정의해야합니다.

기본적으로 point-free 프로그래밍이라고하는데 일부는 pointless이라고합니다. 당신의 사고 방식에 달려 있습니다.

+0

질문은 제목에 있지만 질문을 업데이트했습니다. 나는 하스켈을 여러 번 해봤지만 그걸 얻지는 못했다. 나는 한 번 해답을 주겠다. – megas

관련 문제