Назовите эту конструкцию языка 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])

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

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

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

7 ответов

Решение

Документы 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)

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

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

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

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

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

a  = d, *e

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

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

Смотрите http://en.wikipedia.org/wiki/Apply

Он был в LISP с момента своего появления в 1960 году, что странно. Рад, что Питон открыл это: -}

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

 (определить S
    (структура [t целое число]
               [f float]
               [b (массив логический 1 3)]) структура) определить s

  (= A (массив логический 1 3 ~f ~F ~f))

  (= s (сделать S -3 19.2 (make (массив логический 1 3) ~f ~t ~f))


  (определить foo (строка функции S) ...)

  (foo +17 3e-2 A); стандартный вызов функции (foo s); вот "применять" 

ПАРЛАНСЕ выглядит как шепот, но это не так.

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

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

У 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

Вы также можете превратить это в оператор, так что он будет более похож на сплат:

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

И хотя было бы легко определить аналогичные функции для случаев с тремя, четырьмя и т. Д., Никакой общей функции для n- кортежи (например, сплат работает на других языках) из-за строгой типизации Haskell.

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

Другие вопросы по тегам