Назовите эту конструкцию языка 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, означающего "маленькая звезда", который, в свою очередь, происходит от греческого ἀστερίσκος). Часто, однако, это будет упоминаться как "звезда" или, как указано выше, "сплат".