在 Interactive Ruby (irb) 中清空屏幕

因为强迫症雷达喵的原因,于是有了这两段代码。首先是无空行的版本:

然后是有空行的版本:

好了你们玩儿蛋去。然后以下是对 ruby – How Do You Clear The IRB Console? – Stack Overflow 的部分粗糙翻译。


楼主 John Topley
你们怎么在 IRB 里清屏?


106 票 John Topley
Mac OS XLinux 上你可以用 Ctrl + L 来清空屏幕。


29 票 Ben Hoffstein
Windows 里,把这个代码丢在 %userprofile%\.irbrc 里:


11 票 TW Scannell
Ubuntu 11.10clear 差不多就行了,只是你会看到 => true,把一切搞得很乱。

ruby-1.9.2-p290 :007 > system 'clear'
你会得到

=> true
ruby-1.9.2-p290 :007 >


8 票 AShelly
*nix`clear` 就行了。
有趣的是,在 Windows 上用 system 'cls' 就行,`cls` 却不行。

set_trace_func 和骗局

本文是对 http://t-a-w.blogspot.jp/2007/04/settracefunc-smoke-and-mirrors.html 的粗略翻译,如有错误请务必指正。

Ruby 解释器提供了可用于追踪 Ruby 执行的事件钩子。设置钩子用 set_trace_func(some_proc);卸载钩子则用 set_trace_func(nil)

追踪器恐怕是发明以来最有用的调试工具,远比基于单步和断点的调试器有用。

Ruby 追踪 8 种事件:

  • line – 文件或行改变
  • class – 模块或类定义开始
  • end – 模块或类定义结束
  • call – Ruby 方法调用
  • return – Ruby 方法返回
  • c-call – C 方法调用
  • c-return – C 方法返回
  • raise – 异常抛出

有些事件并不会被追踪,例如设置和读取变量(局部、全局、实例或者类变量)。

例子中,String#+ 运行了三次,IO#write 两次——第二次大概是输出换行符的。

Ruby 中很多东西很神奇并没有被转换为方法调用。这种东西的一种是字符串插值(... #{ code } ...),并没有被转换为 String#+ 或是 Array#join,而是直接由解释器特别的处理。

同样,创建类并没有被转化为 Class#new,添加方法并没有被转换为 Module#define_method。幸运的是 Ruby 提供了特别的钩子让我们需要捕捉这些事件——当类创建时,其父类的 inherited 方法会被调用;当一个方法被添加时,Ruby 调用其类的 method_added

如果我们想跟踪些有用的东西,是时候改改格式了。如果我们对跟踪执行过程感兴趣,通常来说文件及行号都没什么用,return/c-return/end 则应该用缩进代替。同时,相比类,我们更注重的是接收者(`self)。

这里的输出又有点小怪癖。在 Geolocation#initialize 开始时, Geolocation#to_s 就被追踪器调用,而不是在其有意义之后。这种情况下,我们简单的得到了垃圾 <, >。但是有些对象,在初始化之前被打印是会产生异常的。

许多难以找到错误的,最终变成了琐碎的自定义追踪器、grep 或是一些一行 Ruby 脚本来美化事实。

骗局

set_trace_func 不仅仅对调试有用,也适合做各种有趣的事情。Binding.of_caller 是用 set_trace_func 实现的,虽然已经不能用了。magic/help 用了 set_trace_funcirb 中提供方便的帮助:

magic/help 通过设置一个 set_trace_func 钩子工作,执行传送过来的块,然后一遇到感兴趣的事件就停止执行。这意味着 help { rm_rf "/" } 完全是安全的。

我开发 magic/help 时遇到的一个难懂的问题是,方法没有按正确的参数个数调用时,追踪结果不一致。

对于 C 写的方法,就算显式声明了参数个数,Ruby 依然在 ArgumentError.new 前产生 c-call。另一方面,对于 Ruby 写的方法,ArgumentError.new 被调用,然后从函数 return 返回,而不产生 call

要描述这个问题,我们来跟踪一下 C 方法 STDERR.write

与此同时我们跟踪一下 Ruby 方法 FileUtils.remove_entry:

两种情况下,参数都是在调用方法之前被检查的。IO#write 是定义为一个参数的方法:

新版的 magic/help 也能处理这个情况了——如果首事件是 c-callArgumentError.newmagic/help 就等到首个 return 事件(如果有)而不是立刻放弃执行传来的块。快去下载新版,享受神奇的帮助吧。

无语的黄昏 – 序曲

一段很长的时间已经过去,自从上次我在这里留下足迹。一个时代已经过去,自从许久以前的那声呐喊。我甚至认为这是怨念,实际上不过只是矫情而已。

终于在两周前结束了一切,我不知是应宽慰或者反而更加难受。事情不断的重新想起,特别是最近被刻意压制的一些事情。就连过去的论坛上也有因为同样理由离去的人们回来。越来越多的事情不断让我唏嘘不已,例如手机或是电脑上即时通讯工具收到的图片文件夹,几千张图片掠过,我甚至还能想起来是什么时候什么事件什么人儿。

因为一个邪恶以及并不会有任何成效的东西我耽搁了多少事情?!一次次的承诺被推迟以及放弃,甚至还牵扯了他人的梦想。以及不断继续挖坑,伴随着挖坑的快感迎来的是更多的压力。我不止一次感到无力,因为有茫茫多的事情,即使得不到回报,事实上回报也并不是目的。

假期开始之前总是在设想要更加珍惜时间去填坑或者痛痛快快睡一觉,然而事实上总是虽然起早贪黑弄得十分疲倦却依然毫无进展。因为疲倦而不愿动笔,以及因为不知做什么却不去睡觉。我很好的用时差这个理由欺骗自己,可是无论如何又会又什么改变。

帖子的名字来源于过去的一本书,恐怕很少有人知道?甚至豆瓣读书上都找不到。然而我并没有看过这本书,只是喜欢这名字而已。

长满树的叶子

Letter

躲避,让事情变成这样
什麽,之前其实我有很不想去遗忘的
其实,那有怎样呢,很多都是借口
怕,真的躲不过,即便有什么方法
宁可去逆来顺受,不要再躲不过,却,还躲
(差一点都成年了,差一点就不是后来的青春了)
2013.4.25

FIN

FinkgoNekoKun
村上春树的猫城猫的天空之城
无数的记忆,可是我写不下,因为只有 42

前些时候我去围观了那颗 Fuzzy Ginkgo
再也找不到当年那种绿的感觉
Q.E.D.