抑制 Ruby 警告

在 irb 命令行里输入

1
2
3
4
5
>> X = 1
=> 1
>> X = 2
(irb):28: warning: already initialized constant X
=> 2

你会看到上面那行警告, 已经初始化过常量 X, ruby 是在提醒你常量是不应该被改变的, 不过 ruby 只是在抱怨一句罢了, 实际上 X 的值已经由 1 变成 2 了.

警告是对的, 常量的再次赋值有违原则. 但是人总会碰到情非得已的时候.

ruby 论坛上有篇贴子也提到了这一问题, 沙发搞笑的说忽略事情最简单的方式就是闭上眼睛. 不过五楼是正经人, 给出了解决问题的思路. 顺着思路就想到了这个方法.

ruby 接受 -W 作为参数.

1
2
ruby -h
-W[level] set warning level; 0=silence, 1=medium, 2=verbose (default)

运行时对应的是全局变量 $-v

  • nil -W0
  • false -W1
  • true -W2

这样事情就变得简单了.

1
2
3
4
5
6
7
def suppress_warning &block
old_v = $-v
$-v = nil
yield
ensure
$-v = old_v
end

试试效果

1
2
3
4
>> X = 1
=> 1
>> suppress_warning { X = 2 }
=> 2

嗯, 感觉不错, 你也是不清理不舒服斯基吗?