foo.(args_array...)
не работает, потому что он делает:
foo.((1, 2), (3, 4), (5, 6))
# which is roughly equivalent to
[foo(1,3,5), foo(2,4,6)]
Другими словами, он принимает каждый элемент args_array
в качестве отдельного аргумента и затем передает foo
поверх этих аргументов.Вы хотите транслировать foo
через элементы напрямую.Проблема в том, что выполняется:
foo.(args_array)
# is roughly equivalent to:
[foo((1,2)), foo((3,4)), foo((5,6))]
Другими словами, синтаксис широковещания просто передает каждый кортеж в качестве единственного аргумента foo
.Мы можем исправить это с помощью простой промежуточной функции:
julia> bar(args) = foo(args...);
julia> bar.(args_array)
3-element Array{Int64,1}:
3
7
11
Теперь вы делаете то, что хотите!Вам даже не нужно создавать второй аргумент, если вы не хотите.Это в точности эквивалентно:
julia> (args->foo(args...)).(args_array)
3-element Array{Int64,1}:
3
7
11
И на самом деле вы можете легко обобщить это:
julia> splat(f) = args -> f(args...);
julia> (splat(foo)).(args_array)
3-element Array{Int64,1}:
3
7
11