社区讨论

雷竞技网站MikroTik应用
用户头像
Amm0
论坛专家
论坛专家
主题作者
职位: 1665
加入: 2016年5月1日星期日下午7:12
地点:加州

数组函数中的位置参数- $0 vs $1?

2021年12月10日星期五下午5:37

遇到一个奇怪的bug或特性功能当函数作为命名数组元素存储时,使用参数。但我花了一段时间才明白理解发生的事,也许能帮到别人。

函数可以接受形参,形参可以是位置形参,也可以是命名形参。通常,“位置”函数的第一个参数从$1开始。因为函数可以是数组的元素,所以它们也可以像全局(或局部)函数一样接受参数。这一切都很好(与正确的支撑)。

但是当函数从数组中运行时,使用[($数组——> fn)你好),参数“hello”位于$0,而不是预期的$1。对于多个参数,在全局作用域函数中是$2,在数组中定义函数时是$1。基本上,第一个参数是$0还是$1取决于它的位置。即使mixin一个命名参数仍然工作,位置参数只是移动了一个,键=值的工作像往常一样在任何地方。

我会说这是虫子,但比虫子更微妙。但我可以看到逻辑:数组函数更像是CS术语中的匿名函数,而全局函数是命令(命令有名称,名称是参数)-所以是第一个参数已知的函数的值总是$0,如果可用,它可以是它的名称。

然而,这个逻辑是相当微妙的,因为我不知道为什么相同的函数在从全局剪切和粘贴代码到数组时表现不同-我没有注意到它们只是移位:它们只是看起来错误/旧/有时,显然导致代码期望$1=“yes”而不是$1=nil。修复方法很简单:当函数在数组中定义时使用$0。


我认为这显示了我遇到的问题(尽管在示例中比在实际脚本中更明显):
代码:选择所有
$hello:set $hello do={:put "$0 $1"} $hello world #>> $hello world:global greetings [toarray ""]:set ($greetings->"hello") do={:put "hello $1"} [($greetings->"hello") world] #>> hello{/终端样式错误;Put "expected: 'hello world'而不仅仅是'hello'字符串";#使用$0代替,works::set ($greetings->"hello") do={:put "hello $0"} [($greetings->"hello") world] #>> hello world
这是v7.1。但长期v6也是如此。不一定是要求“修理”,但这确实很奇怪。
用户头像
Amm0
论坛专家
论坛专家
主题作者
职位: 1665
加入: 2016年5月1日星期日下午7:12
地点:加州

回复:位置参数在数组函数- $0 vs $1?

2021年12月10日星期五下午6:44

将命名参数/参数与位置参数混合使用到同一个函数中,所有参数仍然与全局参数相同-只是位置参数从$0开始,这里$1是第二个位置参数(命名参数“prefix”可以在任何地方)。

代码:选择所有
:global greetings [toarray ""]:set ($greetings->"hello") do={:put "$0 $prefix $1"} [($greetings->"hello") hello world prefix=mx] #>> hello mx world [($greetings->"hello") prefix=mrs hello world] #>> hello mrs world [($greetings->"hello") hello prefix=mr world] #>> hello mr world


是的,对于全局,它必须分别是1美元和2美元。
代码:选择所有
:global hello do={:put "$1 $prefix $2"} [$hello hello world prefix=mx] #>> hello mx world [$hello prefix=mrs hello world] #>> hello mrs world [$hello hello prefix=mr world] #>> hello mr world

对我来说,“命名参数”(例如[$myfunction val1=me myvar2=1])非常容易,现在当混合时,这就是我遇到麻烦的地方-但是在“数组函数”中使用$0作为第一个位置参数帮助我完成我的脚本。
用户头像
Amm0
论坛专家
论坛专家
主题作者
职位: 1665
加入: 2016年5月1日星期日下午7:12
地点:加州

回复:位置参数在数组函数- $0 vs $1?

2021年12月10日星期五下午6:48

从我掉进这个兔子洞开始。这个get可能会变得奇怪的是函数本身(不是值)在全局元素和数组元素之间的重新赋值…

写了一个小脚本来验证逻辑。因此,似乎通过以任何方式将函数赋值给数组-通过do={}定义它或使用“函数变量”并不重要-凭借叫它虽然数组语法似乎改变了$0 $1参数的含义。不是百分之百确定,但似乎是对的。

也许很难理解-张贴主要是作为双重检查这一点。
代码:选择所有
#全局函数重新赋值:全局echo do={:put "[echo \$0=$0 \$1=$1]";:返回“$ 1”;}:put [$echo "it works from echo"] # array函数重新赋值:global funarray [toarray ""];:设置(funarray美元- >“回声”)做={:把“[(arr) - >回声\ 0 = 0美元\ $ 1 = $ 1]”;: {$0}:put [($funarray->"echo")#重新分配全局$echo作为数组元素的代码:set ($funarray->"aliasfn") $echo{/终端样式错误;:把[(funarray美元- >“aliasfn”)"第一个参数还没出来"];/terminal style none}:put [($funarray->"aliasfn") 0 "第二个参数给调用者"]#…只有“第二个参数”有效-它正在寻找$1,这实际上是第二次调用arg#从数组中重新分配函数并将其设置为global:global aliasfn:set $aliasfn ($funarray->"aliasfn"){/终端样式错误; :put [($aliasfn) "1st arg is not output"]; /terminal style none} :put [($aliasfn) 0 "2nd arg to the caller"] # ...recall the orginal echo is looking for $1 in output, the array assignment loses the command # and why adding 0 above helps to make the 2nd arg be $1

谁在线?

浏览本论坛的用户:没有注册用户和3个访客

Baidu
map