请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于each方法

当你第一次使用each方法,里面的闭包参数写了:def student
1.此时这个student是不是等于it?
2.此时的student是不是就是each源码里面的那个Map类型的self?

正在回答

2回答

你这个问题其实点进源码查看方法就知道

//img1.sycdn.imooc.com//szimg/5ce0c0d40001d4ec22860336.jpg

each其实只是一个语法糖,虽然我们写的时候看起来只传递了一个闭包的参数

//img1.sycdn.imooc.com//szimg/5ce0c144000188e208640168.jpg

但你把生成的class反编译你就会看到,实际在java中是调用的DefaultGroovyMethods.each()然后这个方法需要传递两个参数,第一个是map,第二个是闭包

//img1.sycdn.imooc.com//szimg/5ce0c182000111c218680084.jpg

那么回答你第二个问题self其实是传递进来的Map集合,跟闭包没有关系,接下来我们看你说的第一个问题,最终each方法会调用callClosureForMapEntry()方法

//img1.sycdn.imooc.com//szimg/5ce0c28d0001983429460410.jpg

在方法里面可以看出对于闭包是支持单个参数和两个参数的,如果闭包是单个参数那么传递给闭包的就是map的entry对象,如果闭包是两个参数,那么就是map的key和value,然后又由于如果只是一个参数的时候是可以省略在闭包中的声明的,所以对于你第一个问题student是等于it,也就是map的entry对象

2 回复 有任何疑惑可以回复我~
  • 提问者 全是甘货 #1
    本以为这问题只会有qndroid来答,没想到还能遇到一位大师兄的耐心详尽解答!非常感谢!向您学习!请问下师兄你是真的会把生成的class反编译来看看从而学习吗?通过什么软件反编译呢?
    回复 有任何疑惑可以回复我~ 2019-05-19 13:30:59
  • qndroid #2
    牛逼!!!
    回复 有任何疑惑可以回复我~ 2019-05-21 15:07:15
  • RocketZly 回复 提问者 全是甘货 #3
    用Intellij在out文件夹下能看到生成的class文件,然后点进去就自动给反编译成java代码了
    回复 有任何疑惑可以回复我~ 2019-05-23 10:08:51
qndroid 2020-04-08 20:12:33

完美的回答!

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信