Назовите эту конструкцию языка python/ruby ​​(используя значения массива для удовлетворения функциональных параметров)

Что называется этой конструкцией языка?

В Python я могу сказать:

def a(b,c): return b+c
a(*[4,5])

и получите 9. Аналогично в Ruby:

def a(b,c) b+c end
a(*[4,5])

Что называется, когда один массив передается в функцию, которая в противном случае требует нескольких аргументов?

Как называется оператор *?

Какие другие языки поддерживают эту классную функцию?

Ответ 1

Документы Python называют Распаковка списков аргументов. Это довольно удобная функция. В Python вы также можете использовать двойную звездочку (**) для распаковки словаря (хэша) в аргументы ключевых слов. Они также работают в обратном порядке. Я могу определить такую ​​функцию:

def sum(*args):
    result = 0
    for a in args:
        result += a
    return result

sum(1,2)
sum(9,5,7,8)
sum(1.7,2.3,8.9,3.4)

Чтобы упаковать все аргументы в список произвольного размера.

Ответ 2

В рубине его часто называют "splat".

Также в ruby ​​вы можете использовать его для обозначения "всех других элементов в списке".

a, *rest = [1,2,3,4,5,6]
a     # => 1
rest  # => [2, 3, 4, 5, 6]

Он также может появляться по обе стороны оператора присваивания:

a  = d, *e

В этом использовании это немного похоже на схему cdr, хотя она не должна быть полностью, кроме главы списка.

Ответ 3

Типичная терминология для этого называется "применение функции к списку", или "применить" для краткости.

См. http://en.wikipedia.org/wiki/Apply

Он был в LISP, поскольку в значительной степени его создание в 1960 году было нечетным. Гладкий python заново открыл его: -}

Применяется, как правило, в списке или представлении списка таких как массив. Однако можно применить функции к аргументам, которые происходят из других palces, таких как структуры. Наш язык PARLANSE имеет фиксированные типы (int, float, string,...) и структуры. Как ни странно, список аргументов функции очень похож на структуру Определения, и в PARLANSE, это определение структуры, и вы можете "применить" функцию PARLANSE к совместимой структуре. Вы также можете "создать" экземпляры структуры, таким образом:

 (define S
    (structure [t integer]
               [f float]
               [b (array boolean 1 3)]
    )structure
 )define s

  (= A (array boolean 1 3 ~f ~F ~f))

  (= s (make S -3 19.2 (make (array boolean 1 3) ~f ~t ~f))


  (define foo (function string S) ...)

  (foo +17 3e-2 A) ; standard function call

  (foo s) ; here the "apply"

PARLANSE выглядит как LISP, но нет.

Ответ 4

Ruby называет это splat, хотя Дэвид Блэк также придумал опрятный оператор unar {, ra} y (т.е. унарный оператор без удержания)

Ответ 5

Я называю это "расширением списка", но я не думаю, что стандартная терминология (я не думаю, что там есть...). Lisp во всех версиях (включая Схему) и Haskell и других функциональных языках, можно сделать это достаточно легко, но я не думаю, что это легко сделать на "основных" языках (возможно, вы можете снять его как "отражение" "трюк в некоторых! -).

Ответ 6

Haskell имеет это тоже (для пар), с функцией uncurry:

ghci> let f x y = 2*x + y
f :: (Num a) => a -> a -> a
ghci> f 1 2
4
ghci> f 10 3
23
ghci> uncurry f (1,2)
4
ghci> uncurry f (10,3)
23

Вы также можете превратить его в оператора, поэтому он более похож на splat-like:

ghci> f `uncurry` (1,2)
4
ghci> let (***) = uncurry
(***) :: (a -> b -> c) -> (a, b) -> c
ghci> f *** (10,3)
23

И хотя было бы легко определить похожие функции для 3-кортежей, 4-кортежей и т.д., нет никакой общей функции для n -tuples (например, splat работает на других языках) из-за Строгая типизация Haskell.

Ответ 7

На большинство вопросов уже был дан ответ, но что касается вопроса "Как называется оператор *?": технический термин - "звездочка" (происходит от латинского слова asteriscum, что означает "маленькая звезда", который, в свою очередь, происходит от греческого ἀστερίσκος). Часто, однако, это будет называться "звезда" или, как указано выше, "splat".