删除内核数组方法

时间:2014-04-17 06:02:29

标签: ruby

我想知道如何删除方法Kernel.Array.rand。当用户试图调用它时,它应该给出错误;任何类型的错误都可以。

我尝试如下。我尝试了Kernel.ArrayKernel::Array而不是Random,但它们也没有用。

class << Random; self; end.send :remove_method, :rand

使用我的IRB,我看到了:

2.0.0-p195 :028 > Kernel.Array.rand
ArgumentError: wrong number of arguments (0 for 1)
from (irb):28:in `Array'
from (irb):28

甚至可以在带标签的自动填充功能中使用。

尝试兰德因为必须避免使用随机方法。所以我需要从数组中删除样本和随机播放。

但看看我得到了什么:

class << Array; self; end.send :remove_method, :sample
NameError: method `sample' not defined in Class
from (irb):31:in `remove_method'
from (irb):31

所以,我仍然知道如何从Array中删除一个方法,在这种情况下应该与Kernel.Array相关。

1 个答案:

答案 0 :(得分:5)

您可以使用undef_method(与remove_method的区别在于undef_method会继承继承链)

rand # => 0.3417719504956065

Kernel.send :undef_method, :rand # private method, have to use `send`

rand # ~> -:5:in `<main>': undefined local variable or method `rand' for main:Object (NameError)

更新

啊,你很困惑。有一个Kernel::Array 方法,与Array完全不同。此外,没有必要使用这些特征类构造来混淆代码。你可以这样做:

module Kernel
  undef_method :rand
end

class Array
  undef_method :sample
end

rand # ~> -:9:in `<main>': undefined local variable or method `rand' for main:Object (NameError)
[1, 2].sample # ~> -:10:in `<main>': undefined method `sample' for [1, 2]:Array (NoMethodError)