分享方式:


Bicep 中的使用者定義函式

在您的 Bicep 檔案內,您可以建立自己的函式。 這些函式可供您在 Bicep 檔案中使用。 使用者定義函式與 Bicep 檔案中自動提供的標準 Bicep 函式不同。 若您有在 Bicep 檔案中重複使用的複雜運算式,請建立您自己的函式。 使用使用者定義函式會自動啟用 語言 2.0 版程式代碼產生。

需要 Bicep CLI 0.26.X 版或更高版本才能使用此功能。

限制

定義使用者函式時有若干限制:

  • 此函式無法存取變數。
  • 此函式只能使用函式中定義的參數。
  • 此函式無法使用 reference 函式或任何 list 函式。
  • 函式的參數不能有預設值。

定義函式

您可以使用 func 陳述式來定義使用者定義的函式。

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

範例

下列範例描述如何定義和使用使用者定義的函式:

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')

上述範例的輸出為:

名稱 類型
azureUrl String https://microsoft.com/azure
greetingArray 陣列 ["Hi Evie!","Hi Casper!"]
greetingObject Object {"hello":"Hi John!"}
nameArray 陣列 ["John"]
addNameArray 陣列 ["Mary","Bob","John"]

使用 Bicep CLI version 0.23.X 版或更高版本時,您可以在使用者定義的函式內叫用另一個使用者定義的函式。 在上述範例中,使用 sayHelloString 的函式定義,您可以將 sayHelloObject 函式重新定義為:

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

使用者定義的函式支援使用使用者定義的資料類型 (部分機器翻譯)。 例如:

@minValue(0)
type positiveInt = int

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

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

output elements positiveInt = typedArg(inArray)

前述範例的輸出為:

名稱 類型
項目 positiveInt 3

使用裝飾項目

裝飾項目是以 @expression 格式撰寫的,放置於函式宣告上方。 下表顯示函式的可用裝飾項目。

裝飾項目 Argument 描述
description 字串 提供函式的描述。
export none 表示函式可供其他 Bicep 檔案匯入。
中繼資料 object 要套用至函式的自訂屬性。 可以包含相當於描述裝飾項目的描述屬性。

裝飾項目在 sys 命名空間中。 如果您需要區別裝飾項目與具有相同名稱的另一個項目,請在裝飾項目前面加上 sys。 例如,如果您的 Bicep 檔案包含名為 description 的變數,則在使用描述裝飾項目時,您必須新增 sys 命名空間。

描述

若要新增說明,請將描述新增至函式宣告。 例如:

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

Markdown 格式的文字可用於描述文字。

Export

使用 @export() 與其他 Bicep 檔案共用函式。 如需詳細資訊,請參閱匯出變數、類型和函式

中繼資料

如果您有自訂屬性要套用至使用者定義的函式,請新增中繼資料裝飾項目。 在中繼資料內,使用自訂名稱和值定義物件。 您為中繼資料定義的物件可以包含任何名稱和類型的屬性。

您可以使用此裝飾項目,追蹤對於新增至描述並無意義之函式的相關資訊。

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

若您提供的 @metadata() 裝飾項目含有的屬性與另一個裝飾項目衝突,該裝飾項目一律優先於 @metadata() 裝飾項目中任何元素, 因此 @metadata() 值中的衝突屬性會變成多餘的,並受到取代。 如需詳細資訊,請參閱沒有衝突的中繼資料 (機器翻譯)。

下一步