2012-09-01 4 views
24

튜플 인수를 전달하는 가장 좋은 방법은 무엇입니까?튜플 인수를 전달하는 가장 좋은 방법은 무엇입니까?

예 :

def foo(...): (Int, Int) = ... 

def bar(a: Int, b: Int) = ... 

가 지금은 barfoo의 출력을 전달하고 싶습니다. 우리가 n > 2n -tuple 다루는 특히이 방법은 조금 추한 모습

val fooResult = foo(...) 
bar(fooResult._1, fooResult._2) 

:이 달성 될 수있다. 또한 foobar(foo._1, foo._2)을 사용하여 두 번 이상 실행되어야하기 때문에 foo의 결과를 추가 값에 저장해야합니다.

튜플을 인수로 전달하는 더 좋은 방법이 있습니까?

val bar2 = (bar _).tupled // or Function.tupled(bar _) 

bar2(Int, Int) (같은 bar로 인수)의 튜플을 취

+1

가능한 튜플에 함수를 적용하는 방법? (http://stackoverflow.com/questions/1987820/how-to-apply-a-function-to-a-tuple) –

답변

39

모든 기능을 사용할 수있는 특별한 tupled 방법이있다. 지금 당신은 말할 수 :

bar2(foo()) 

당신의 방법이 실제로 있다면 기능을합니다 (val 키워드를 통지) 구문이 훨씬 더 쾌적 :

val bar = (a: Int, b: Int) => //... 
bar.tupled(foo()) 

를 참조하십시오
+0

감사합니다. 이것이 제가 찾고 있던 것입니다. 그것은 나를 위해 트릭을 할 것입니다. 추가 질문 : 방법과 기능의 차이점이 무엇인지, 그 차이점은 무엇입니까? 나는 그것에 대해 더 알고 싶다. 좀 더 자세한 정보를 볼 수있는 참고 문헌/링크를 나에게 줄 수 있습니까? –

+3

@JohnThreepwood : 스칼라의 메서드는 Java의 메서드로 변환합니다. 스칼라의 함수는 객체로 변환합니다. 스칼라에서 이것은 대부분 투명합니다 ("* eta-expansion *"검색). 그러나 때로는 구문이 약간 다릅니다. [이 기사] (http://jim-mcbeath.blogspot.no/2009/05/scala-functions-vs-methods.html)는 매우 포괄적입니다. –

+0

대단히 감사합니다. –

8

tupled을 사용하면 @ 토마스가 언급하는 것은 좋은 접근법이다.

또한 할당시 foo에서 반환 된 튜플을 추출 할 수있다 :이 청소기 코드 (NO _1_2)의 이점이

val (x, y) = foo(5) 
bar(x, y) 

, 당신은 xy에 대한 설명 이름을 지정할 수 있습니다, 제작하여 코드를 읽기가 쉽다.

+0

고맙습니다. 나는 동의한다, 이것은 더 가독하다. 나는 그 트릭을 염두에 두겠다. 그러나 여분의 가치는 나를 조금 괴롭힌다. 나는 그 결과를 여분의 값으로 저장하지 않고 통과시키고 싶다. 하지만 아직도이 힌트를 주셔서 감사합니다! –

5

그것은 가치도 알고 약

foo(...) match { case (a,b) => bar(a,b) } 

명시 적으로 임시 fooResult를 만들 필요가 없습니다 대안으로. 속도와 클러 터 부족이 중요한 경우에 좋은 절충안입니다. bar _을 사용하여 함수를 만든 다음 .tupled을 사용하여 단일 튜플 인수를 사용하도록 변환 할 수 있지만이 경우 호출 할 때마다 두 개의 새 함수 개체가 만들어집니다. 결과를 저장할 수는 있지만 코드가 불필요하게 복잡해질 수 있습니다. 일상적인 사용을 위해

(즉,이 코드의 성능을 제한 일부가 아닌)을 수행 할 수 있습니다 단지

라인
(bar _).tupled(foo(...)) 

.물론 두 개의 함수 객체를 추가로 만들었지 만 튜플을 만들었을 가능성이 가장 높습니다. 따라서 과 비슷합니다.

+0

이 대안을 지적 해 주셔서 감사합니다. 하지만 리턴 값 튜플은 왜 성능에 신경 쓰지 않는 신호인가? 그러나 네, 당신 말이 맞습니다. 제 프로그램에서는 그다지 중요하지 않습니다. –

+0

@JohnThreepwood - 튜플을 반환하는 객체를 만들어야합니다. 만약 당신이하고있는 일이 오브젝트 생성에 비해 비용이 많이 든다면, 두 개의 오브젝트 생성 (이것은'bar _'과'.tupled '으로 얻는 것)과 비교할 때 아마도 비싸기 때문일 것입니다. 당신이하는 일이 객체 생성에 비해 싸다면 왜 객체를 만들었습니까? 당신은 당신이 설정할 수있는 vars가있는 객체를 전달해야합니다. 후자의 접근법은 객체 생성이 상당히 저렴한 경우에 거의 수행하지 않아야하는 작업입니다. –

+0

명확히 해주셔서 감사합니다. explaination은 의미가있다, 나는 그것을 명심할 것이다. –

관련 문제