Udostępnij za pośrednictwem


Funkcje zdefiniowane przez użytkownika w Bicep

W pliku Bicep możesz utworzyć własne funkcje. Te funkcje są dostępne do użycia w plikach Bicep. Funkcje zdefiniowane przez użytkownika są oddzielone od standardowych funkcji Bicep, które są automatycznie dostępne w plikach Bicep. Utwórz własne funkcje, gdy masz skomplikowane wyrażenia, które są używane wielokrotnie w plikach Bicep. Użycie funkcji zdefiniowanych przez użytkownika automatycznie włącza generowanie kodu w wersji 2.0 języka.

Do korzystania z tej funkcji jest wymagany interfejs wiersza polecenia Bicep w wersji 0.26.X lub nowszej .

Ograniczenia

Podczas definiowania funkcji użytkownika istnieją pewne ograniczenia:

  • Funkcja może używać tylko parametrów zdefiniowanych w funkcji.
  • Funkcja nie może używać funkcji reference ani żadnej z funkcji listy .
  • Parametry funkcji nie mogą mieć wartości domyślnych.

Definiowanie funkcji

Użyj instrukcji func , aby zdefiniować funkcje zdefiniowane przez użytkownika.

@<decorator>(<argument>)
func <user-defined-function-name> (<argument-name> <data-type>, <argument-name> <data-type>, ...) <function-data-type> => <expression>

W poniższych przykładach pokazano, jak definiować i używać funkcji zdefiniowanych przez użytkownika:

func buildUrl(https bool, hostname string, path string) string => '${https ? 'https' : 'http'}://${hostname}${empty(path) ? '' : '/${path}'}'

func sayHelloString(name string) string => 'Hi ${name}!'

func sayHelloObject(name string) object => {
  hello: 'Hi ${name}!'
}

func nameArray(name string) array => [
  name
]

func addNameArray(name string) array => [
  'Mary'
  'Bob'
  name
]

output azureUrl string = buildUrl(true, 'microsoft.com', 'azure')
output greetingArray array = map(['Evie', 'Casper'], name => sayHelloString(name))
output greetingObject object = sayHelloObject('John')
output nameArray array = nameArray('John')
output addNameArray array = addNameArray('John')

Dane wyjściowe z poprzednich przykładów to:

Nazwisko Typ Wartość
Azure URL Sznurek https://microsoft.com/azure
tablicaPowitań Tablica ["Cześć Evie!", "Cześć Casper!"]
obiekt powitania Objekt {"hello":"Cześć John!"}
nameArray Tablica ["Jan"]
addNameArray Tablica ["Mary","Bob","John"]

Masz elastyczność wywoływania innej funkcji zdefiniowanej przez użytkownika w ramach funkcji zdefiniowanej przez użytkownika. W poprzednim przykładzie z definicją sayHelloStringfunkcji można ponownie zdefiniować sayHelloObject funkcję jako:

func sayHelloObject(name string) object => {
  hello: sayHelloString(name)
}

Funkcje zdefiniowane przez użytkownika obsługują używanie typów danych zdefiniowanych przez użytkownika. Na przykład:

@minValue(0)
type positiveInt = int

func typedArg(input string[]) positiveInt => length(input)

param inArray array = [
  'Bicep'
  'ARM'
  'Terraform'
]

output elements positiveInt = typedArg(inArray)

Dane wyjściowe z poprzedniego przykładu to:

Nazwisko Typ Wartość
elementy positiveInt 3

Od wersji interfejsu wiersza polecenia Bicep w wersji 0.30.X funkcje zdefiniowane przez użytkownika mogą uzyskiwać dostęp do zmiennych zdefiniowanych w tym samym pliku Bicep. W poniższym przykładzie pokazano, jak funkcja zdefiniowana przez użytkownika może odwoływać się do zmiennej:

var greetingPrefix = 'Hello'

func greet(name string) string => '${greetingPrefix}, ${name}!'

output message string = greet('Azure')

Dane wyjściowe z poprzedniego przykładu to:

Nazwisko Typ Wartość
Komunikat Sznurek Witaj, Azure!

Począwszy od interfejsu wiersza polecenia Bicep w wersji 0.31.X, zmienne importowane z innych plików Bicep są dostępne w funkcjach zdefiniowanych przez użytkownika, podobnie jak zmienne zdefiniowane lokalnie.

Załóżmy, że masz plik Bicep o nazwie shared.bicep , który eksportuje zmienną:

// shared.bicep
@export()
var sharedPrefix = 'Contoso'

Tę zmienną można zaimportować do głównego pliku Bicep i użyć jej wewnątrz funkcji zdefiniowanej przez użytkownika:

import shared from './shared.bicep'

func makeResourceName(suffix string) string => '${shared.sharedPrefix}-${suffix}'

output resourceName string = makeResourceName('storage')

Dane wyjściowe z poprzedniego przykładu to:

Nazwisko Typ Wartość
nazwaZasobu Sznurek Magazyn firmy Contoso

Aby uzyskać więcej informacji na temat importowania zmiennych, zobacz Eksportowanie zmiennych, typów i funkcji.

Korzystanie z dekoratorów

Dekoratory są zapisywane w formacie @expression i umieszczane powyżej deklaracji funkcji. W poniższej tabeli przedstawiono dostępne dekoratory funkcji.

Dekorator Argumentacja opis
opis sznurek Podaj opisy funkcji.
eksport Brak Wskazuje, że funkcja jest dostępna do zaimportowania przez inny plik Bicep.
metadane obiekt Właściwości niestandardowe, które mają być stosowane do funkcji. Może zawierać właściwość opisu, która jest równoważna dekoratorowi opisu.

Dekoratory znajdują się w przestrzeni nazw systemu. Jeśli musisz odróżnić dekorator od innego elementu o tej samej nazwie, należy poprzeć dekorator za pomocą polecenia sys. Jeśli na przykład plik Bicep zawiera zmienną o nazwie description, należy dodać przestrzeń nazw systemu podczas korzystania z dekoratora opisu .

opis

Aby dodać wyjaśnienie, dodaj opis do deklaracji funkcji. Na przykład:

@description('The say hello function.')
func sayHelloString(name string) string => 'Hi ${name}!'

Tekst w formacie markdown może służyć do tekstu opisu.

Eksport

Użyj @export() polecenia , aby udostępnić funkcję innym plikom Bicep. Aby uzyskać więcej informacji, zobacz Eksportowanie zmiennych, typów i funkcji.

Metadane

Jeśli masz właściwości niestandardowe, które chcesz zastosować do funkcji zdefiniowanej przez użytkownika, dodaj dekorator metadanych. W metadanych zdefiniuj obiekt z niestandardowymi nazwami i wartościami. Obiekt zdefiniowany dla metadanych może zawierać właściwości dowolnej nazwy i typu.

Możesz użyć tego dekoratora do śledzenia informacji o funkcji, która nie ma sensu dodawać do opisu.

@description('Configuration values that are applied when the application starts.')
@metadata({
  source: 'database'
  contact: 'Web team'
})
type settings object

Po podaniu dekoratora @metadata() z właściwością, która powoduje konflikt z innym dekoratorem, dekorator zawsze ma pierwszeństwo przed wszystkimi elementami w dekoratorze @metadata() . Dlatego właściwość powodująca konflikt w ramach @metadata() wartości jest nadmiarowa i zostanie zamieniona. Aby uzyskać więcej informacji, zobacz Brak powodujących konflikt metadanych.

Następne kroki