如何在引用数组中的单个元素时强制自定义Powershell函数的行为类似于[System.String]方法Split

问题描述

示例:

"a b c d e f g".Split(" ")[0]

a

当我尝试通过函数执行相同操作

function MyReturnArray
{
    $array = @('a','b','c','d','e','f','g')
    return $array
}

MyReturnArray[0] : The term 'MyReturnArray[0]' is not recognized as the name of a cmdlet,function,script file,or operable program. Check the spelling of the 
name,or if a path was included,verify that the path is correct and try again.
At line:1 char:1
+ MyReturnArray[0]
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (MyReturnArray[0]:String) [],CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

但是,这可行:

(MyReturnArray)[0]

a

问题是,为什么.Split()方法类型的[System.String]不需要分组()或括号来访问单个元素?但是我必须有自己的职能。我如何强迫它像.Split()一样动作?

解决方法

“如何强制其像使用.Split()一样进行操作?”

(令人失望的)答案是:您不

为什么?因为那根本不是语言的工作方式:)


更完整的解释:

元素访问运算符[]用于我们称之为语法有界表达式(在PowerShell 3.0 Language Specification中称为 primary expression ,我只知道尝试记录PowerShell完整语法的官方文件。

"a b c d e f".Split()是我们所说的成员访问表达式-它本身包括:

  • 另一个有界表达式"a b c d e"
  • 实例成员访问运算符.
  • 具有参数列表Split()的成员参数。

成员访问表达式是有界表达式-结束)是成员访问运算符(中间的.)可能接受的最后一个可能的标记,因此我们知道表达式结束

是什么使字符串文字"a b c d e f"成为有界表达式?与上述原理相同,解析器可以通过查看前端和后端的"独立地确定字符串的边界。

但是,

MyReturnArray不是 有界表达式。这是一个命令表达式 _,并且有单独的命令表达式解析规则,以使参数绑定能够像在PowerShell中一样工作,而且还允许命令名称为任何东西-如果您想创建一个字面名为MyReturnArray[0]的函数,那绝对是有效的。

如您所见,您可以将其括在()括号中,从而为调用MyReturnArray创建一个语法边界,[]可以对其进行运算。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...