ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1330|回复: 10

[求助] 求教PowerQuery中用空括号传参的作用:()=>,详见下图

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-10-9 23:49 | 显示全部楼层 |阅读模式
如图圈1的地方,引用的是列表{1..4}的数据,问题1是它把参数传给谁了呢,问题2,圈2的地方,一个空括号,它引用了什么数据,又把什么参数传递给了谁,如果什么都没引用也没传递为什么还要写这个空括号呢,问题3,圈1处可以用each代替圈2处还不能用each代替,这个是为什么啊,头疼啊,求帮忙解释下,谢谢!!

代码:= List.Transform({1..4},(x)=> Function.InvokeAfter(()=> DateTime.LocalNow(),#duration(0,0,0,1)))
QQ截图20221009234055.jpg

TA的精华主题

TA的得分主题

发表于 2022-10-10 09:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
没见过这么个东西

TA的精华主题

TA的得分主题

发表于 2022-10-10 10:16 | 显示全部楼层
可以写成  each _ , (x)=>   等同于 each _

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-10-10 10:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
有的时候多个嵌套这个 each _  就不知道代表哪一层的, 就需要使用(x)=>   (y)=>  就可以区分了!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-10-10 10:23 | 显示全部楼层
你举例的这个函数属于比较特殊,前面的这个list, 相当于迭代4次, 后面的那个Function.InvokeAfter() 是对前面的日期时间往后一个时间间隔。每一秒就执行获取当前时间,这里确实没有前面的参数传过来

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-10-10 17:10 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-10 19:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
luzwales 发表于 2022-10-10 10:16
可以写成  each _ , (x)=>   等同于 each _

这里圈2后面的()=>好像不能写成each _形式,这里没有传参,()=>DateTime.LocalNow ()可以替换成DateTime.LocalNow,也就是去掉()=>这个代码“因为Function.InvokeAfter的第一个参数要求是一个函数”,但同时也要去掉DateTime.LoclNow后面的()

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-10 19:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

圈1没有传参,但是因为List.Transform的第二个参数要求是Function,所以要有(x)=>或者each 或者纯函数名不带括号的形式;圈2的括号里面没有形参应该是由于没有引用任何数据源而且目标函数也没有参数,所以括号里没有变量也不能用each 代替,我猜测是这样,然后()=>DateTime.LocalNow ()可以替换成DateTime.LocalNow,也就是去掉()=>这个代买,因为Function.InvokeAfter的第一个参数要求是一个函数,但同时也要去掉DateTime.LoclNow后面的()

TA的精华主题

TA的得分主题

发表于 2022-10-11 09:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
PQ可能是MS所有产品线里,说明文档最语焉不详的一个,没有之一!就我在实际工作中看到、了解到的情况,PQ的地位也确实很尴尬,抛开PQ本身的运行效率很一般不说,一般大一点的公司都有完备的ETL流程、数据仓库、数据集市等等,数据清洗、维度建模等早就完成,PQ连替补都打不上。。。


扯远了,说回你提出的问题,这样改写一下:
  1. let
  2.     Source = List.Transform(
  3.         {"1".."4"},
  4.         (x) => Function.InvokeAfter(
  5.                 (optional arg) => "第" & x & "次计时: " & DateTime.ToText(DateTime.FixedLocalNow()),
  6.                 #duration(0,0,0,1)
  7.         )
  8.     )
  9. in
  10.     Source
复制代码

  • {"1".."4"}中的每个元素依次被传递给(x)=>后面所定义的整个函数体了,至于x用不用,是所定义的函数体的事,谁也没规定传进来就必须得用,就像这样:List.Transform({1..4}, (x)=>"我就是不用"),仍然可以正常运算得出结果;
  • Function.InvokeAfter(function as function, delay as duration)的1参必须是函数,既然是函数,就得有个函数的样子嘛,也就是通常见到这个样子:
    (参数) => 函数体
    恰好DateTime.LocalNow()需要传入的参数个数为0,那么就弄个()=>形式即可,或者像我写的那样(optional arg)=>,这里的关键字optional不可少。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-10-12 00:58 来自手机 | 显示全部楼层
ThxAlot 发表于 2022-10-11 09:37
PQ可能是MS所有产品线里,说明文档最语焉不详的一个,没有之一!就我在实际工作中看到、了解到的情况,PQ的 ...

谢谢,这里的空括号()=>不能用each代替也是因为each传入的参数个数不是0是么,而我试了一下这样写:DateTime.FixedLocalNow直接不带括号也行
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 13:32 , Processed in 0.040073 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表