zsh:从函数返回关联数组

Alt*_*cho 4 shell zsh

如何从 zsh 函数返回关联数组?

我试过:

creatAARR() {
    declare -A AARR=([k1]=2 [k2]=4)
    return $AARR
}
creatAARR
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

creatAARR:return:2: too many arguments
Run Code Online (Sandbox Code Playgroud)

正确的方法是什么?

编辑: 我将输出捕获到标准输出,就像@chepner建议的那样,但新变量的行为似乎不像关联数组:

creatAARR() {
    declare -A AARR=([k1]=2 [k2]=4)
    echo "$AARR"
}
declare -A VALL
NEW_ARR=$(creatAARR)
echo "$NEW_ARR" # 2 4
echo "k1: $NEW_ARR[k1]" # prints just k1:
return
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

Mar*_*ert 5

return仅接受整数并设置函数的退出状态。

\n

Shell 命令实际上不能返回值。如果您想将信息传递给函数的调用者,您可以使用以下几个选项:

\n
    \n
  • 可以 print返回值,但这取决于您正确格式化输出以及调用者正确解析它。对于关联数组,有很多种可能会出错;我不建议\xe2\x80\x99 这样做。
  • \n
  • 在 Zsh 中,有一个约定,为了传达返回值,函数可以设置$REPLY为标量值或$reply数组。不幸的是,没有传递关联数组的约定。当然,您可以将键值对简单地作为非关联数组中的元素$reply,然后让调用者将其转换为或将其包装在关联数组中,但这会打破约定,因此可能会违反您的调用者\的期望。
  • \n
  • 在我看来,最好的方法是让调用者指定关联数组的名称,然后您可以用值填充该数组。当您想要返回任何类型的多个值时,这也很方便,因为您可以让调用者指定多个变量名称。
  • \n
\n

您可以使用最后一种方法,如下所示:

\n
% creatAARR() {\n  # Restrict $name to function scope.\n  local name=$1\n\n  # Delete $1, so $@ becomes the other args.\n  shift\n\n  # Assign elements to array. \n  set -A "$name" "$@"\n}\n% typeset -A AARR=()  # Declare assoc. array\n% creatAARR AARR k1 2 k2 4\n% typeset -p1 AARR    # Print details\ntypeset -A AARR=( \n  [k1]=2 \n  [k2]=4 \n)\n
Run Code Online (Sandbox Code Playgroud)\n