用pry阅读ruby源码--以task方法为例
rails项目中有个目录 lib/tasks,里面定义了一个rake任务:
task hello: :hello do
puts “hello”
end
看到这里的时候,是不是可能会对 task 方法产生一些兴趣?
可以在rails项目的Gemfile中加入 pry这个强大的工具,然后一步步找到这个task方法的本质。
1,在task中加入断点:
binding.pry
2,断点中用 show-method 方法
用show-method按图索骥,可以层层揭开 task 的面纱。
[33] pry(main)>
[34] pry(main)> show-method taskFrom: /home/liukun/.rvm/gems/ruby-2.1.1@zhe800_zhaoshang/gems/rake-10.0.4/lib/rake/dsl_definition.rb @ line 31:
Owner: Rake::DSL
Visibility: private
Number of lines: 3def task(*args, &block)Rake::Task.define_task(*args, &block)
end
[35] pry(main)> show-method Rake::Task.define_taskFrom: /home/liukun/.rvm/gems/ruby-2.1.1@zhe800_zhaoshang/gems/rake-10.0.4/lib/rake/task.rb @ line 350:
Owner: #<Class:Rake::Task>
Visibility: public
Number of lines: 3def define_task(*args, &block)Rake.application.define_task(self, *args, &block)
end
[36] pry(main)> show-method Rake.application.define_taskFrom: /home/liukun/.rvm/gems/ruby-2.1.1@zhe800_zhaoshang/gems/rake-10.0.4/lib/rake/task_manager.rb @ line 23:
Owner: Rake::TaskManager
Visibility: public
Number of lines: 13def define_task(task_class, *args, &block)task_name, arg_names, deps = resolve_args(args)task_name = task_class.scope_name(@scope, task_name)deps = [deps] unless deps.respond_to?(:to_ary)deps = deps.collect {|d| d.to_s }task = intern(task_class, task_name)task.set_arg_names(arg_names) unless arg_names.empty?if Rake::TaskManager.record_task_metadataadd_location(task)task.add_description(get_description(task))endtask.enhance(deps, &block)
end
[37] pry(main)>
3, environment的作用是什么?
用来通知Rake需要加载rails环境。
参考:
http://stackoverflow.com/questions/7044714/whats-the-environment-task-in-rake
4,进一步理解 environment
http://jasonseifer.com/2010/04/06/rake-tutorial
task :turn_off_alarm doputs "Turned off alarm. Would have liked 5 more minutes, though."endtask :groom_myself doputs "Brushed teeth."puts "Showered."puts "Shaved."endtask :make_coffee docups = ENV["COFFEE_CUPS"] || 2puts "Made #{cups} cups of coffee. Shakes are gone."endtask :walk_dog doputs "Dog walked."endtask :ready_for_the_day => [:turn_off_alarm, :groom_myself, :make_coffee, :walk_dog] doputs "Ready for the day!"end
By running the ready_for_the_day task it notices that the turn_off_alarm, groom_myself, make_coffee, and walk_dog tasks are all prerequisites of the ready_for_the_day task. Then it runs them all in the appropriate order.
用pry阅读ruby源码--以task方法为例相关推荐
- 逐行阅读redux源码(二)combineReducers
前情提要 逐行阅读redux源码(一)createStore 认识reducers 在我们开始学习源码之前,我们不妨先来看看何谓reducers: 如图所见,我们可以明白, reducer 是用来对初 ...
- C++Primer Plus (第六版)阅读笔记 + 源码分析【目录汇总】
C++Primer Plus (第六版)阅读笔记 + 源码分析[第一章:预备知识] C++Primer Plus (第六版)阅读笔记 + 源码分析[第二章:开始学习C++] C++Primer Plu ...
- webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...
引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...
- 阅读react-redux源码(七) - 实现一个react-redux
阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...
- 阅读react-redux源码(六) - selectorFactory处理store更新
阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...
- 阅读react-redux源码(五) - connectAdvanced中store改变的事件转发、ref的处理和pure模式的处理
阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...
- 阅读react-redux源码(四) - connectAdvanced、wrapWithConnect、ConnectFunction和checkForUpdates
阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...
- 阅读react-redux源码(三) - mapStateToPropsFactories、mapDispatchToPropsFactories和mergePropsFactories
阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...
- 阅读react-redux源码(二) - createConnect、match函数的实现
阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 上一节看了Provider组 ...
最新文章
- 数字信号处理与音频处理(使用Audition)
- 全国大学生智能汽车竞赛-百度线下赛道报名开始!
- 《Linux内核设计与实现》课程学习重点问题总结
- 张志华 机器学习 两门课程正确顺序及视频连接
- NYOJ 888 取石子(九)
- 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理
- mysql读锁和写锁
- gateway请求拦截_一种网关对用户请求进行统一拦截判断是否放行的方法与流程...
- ccf推荐期刊和会议目录_重磅快讯:大数据入选CCF推荐中文科技期刊目录!
- 虚拟机查看cpu型号_CentOS7安装KVM虚拟机
- 携程“线上摆摊”:1晚赚3105万
- 第五章:Redis pipeline流水线
- 流量清洗是什么意思?
- git push you are not allowed to upload merges
- 【读书笔记】投资中最简单的事-邱国鹭,别人恐惧我贪婪,别人贪婪我respect
- linux下安装drcom方法
- 图片验证码 java_java生成图片验证码
- 美林数据“智能反窃电分析应用”荣获大数据星河奖
- 主成分分析PCA+C代码
- 算法图解第十、十一章读书笔记
热门文章
- 疫情当前,云计算、大数据、AI将如何帮助人类打赢这场“战疫”?
- 我与搜狗输入法的情缘
- R语言 Error in file(file, “rt“) : 无法打开链结
- 硝烟中的scrum和XP——我们如何实施scrum读后笔记
- 薪酬管理专业术语大全
- power BI 天气数据爬取
- input改为number类型,去掉上下箭头
- 科研入门宝典(二):文献调研工作如何展开
- android圆形波纹按钮,android自定义View——圆形波纹扫描效果
- mac在终端查看本地ip