How to pass a tuple argument the best way?

后端 未结 3 758
猫巷女王i
猫巷女王i 2021-02-01 02:12

How to pass a tuple argument the best way ?

Example:

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

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

Now I would like to

相关标签:
3条回答
  • 2021-02-01 02:48

    There is a special tupled method available for every function:

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

    bar2 takes a tuple of (Int, Int) (same as bar arguments). Now you can say:

    bar2(foo())
    

    If your methods were actually functions (notice the val keyword) the syntax is much more pleasant:

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

    See also

    • How to apply a function to a tuple?
    0 讨论(0)
  • Using tupled, as @Tomasz mentions, is a good approach.

    You could also extract the tuple returned from foo during assignment:

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

    This has the benefit of cleaner code (no _1 and _2), and lets you assign descriptive names for x and y, making your code easier to read.

    0 讨论(0)
  • 2021-02-01 03:12

    It is worth also knowing about

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

    as an alternative that doesn't require you to explicitly create a temporary fooResult. It's a good compromise when speed and lack of clutter are both important. You can create a function with bar _ and then convert it to take a single tuple argument with .tupled, but this creates a two new function objects each time you call the pair; you could store the result, but that could clutter your code unnecessarily.

    For everyday use (i.e. this is not the performance-limiting part of your code), you can just

    (bar _).tupled(foo(...))
    

    in line. Sure, you create two extra function objects, but you most likely just created the tuple also, so you don't care that much, right?

    0 讨论(0)
提交回复
热议问题