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