2016-04-07 3 views
2

他の人が独自の擬似ランダムメソッドを作成したとしましょう。プログラミング練習として。そして、我々は、彼らがこれまでショートカットArrayクラスのシャッフルとサンプルを無効にする

として組み込み関数に解決しようとするたびにエラーが発生する場合、これは私がやっていることです:

ERROR_STRING_FOR_RANDOM = "Usage of built-in random generators is not allowed" 

methods_to_block = ["rand", "srand", "Random::rand", "Random::srand", 
"Random::seed", "Random::new", "Kernel::rand", "Kernel::srand", 
"Array::shuffle", "Array::shuffle!", "Array::sample"] 

methods_to_block.each do |method| 
    eval 
    """ 
    def #{method} 
    raise ERROR_STRING_FOR_RANDOM 
    end 
    """ 
end 

だから、それブロックランダムに、そしてこれらの昇給エラー:

rand 
srand 
Random.new.rand(18) 

ただし、配列の疑似ランダムメソッドでは機能しません。たとえば、

[1,2,3].shuffle! 

まだ動作します。なぜそれが起こり、それを防ぐのですか?

答えて

2

を得ることができ、あなたが固執する場合、それはあなたに

を助ける

ERROR_STRING_FOR_RANDOM = "Usage of built-in random generators is not allowed" 

methods_to_block = ["rand", "srand", "Random::rand", "Random::srand", 
"Random::seed", "Random::new", "Kernel::rand", "Kernel::srand", 
"Array::shuffle", "Array::shuffle!", "Array::sample"] 


methods_to_block.each do |method| 
if method.split("::").size > 1 && method.split("::").first != "Kernel" 
class_name = method.split("::").first 
method_name = method.split("::").last 
er = <<ER 
class #{class_name} 
def #{method_name} 
raise ERROR_STRING_FOR_RANDOM 
end 
end 
ER 
eval(er) 
else 
define_method "#{method}" do 
raise ERROR_STRING_FOR_RANDOM 
end 
end 
end 

あなたの方法のまま願っています無効にしたいメソッド...

class Array 
    ERROR_STRING_FOR_RANDOM = "Usage of built-in random generators is not allowed" 
    RANDOM_METHODS = [:shuffle, :shuffle!, :select] 
    def rajarshi_random_error 
    raise ERROR_STRING_FOR_RANDOM 
    end 
    RANDOM_METHODS.each do |m| 
    define_method(m) {|*args| rajarshi_random_error } 
    end 
end 
+0

:) ..............:彼らはただのrandとsrand関数を無効にする正しい方法は次のようになり、代わりに同様の方法

を再定義するクラス内の定数を作成します......... –

2

あなたのコードは、エラー

ArgumentError: wrong number of arguments (0 for 1..4) 

を得ていたが、他の同様のモジュールの機能のために、あなただけの場合、それは今

methods_to_block.each do |method| 
    define_method "#{method}" do 
    raise ERROR_STRING_FOR_RANDOM 
    end 
end 
#=> ["rand", "srand", "Random::rand", "Random::srand", "Random::seed", "Random::new", "Kernel::rand", "Kernel::srand", "Array::shuffle", "Array::shuffle!", "Array::sample"] 

のように見えるべきである

methods_to_block = ["rand", "srand","seed", "sample", "shuffle!", "shuffle!"] 

のようなメソッドを定義することができますあなたに電話する

> srand 
RuntimeError: Usage of built-in random generators is not allowed 

> rand 
RuntimeError: Usage of built-in random generators is not allowed 

は今、あなたはあなたがクラスを開いて交換することができ、すべての

> srand 
RuntimeError: Usage of built-in random generators is not allowed 

> rand 
RuntimeError: Usage of built-in random generators is not allowed 

> [2,3,4,5].shuffle 
RuntimeError: Usage of built-in random generators is not allowed 
0

これは動作します:

class Array 
    undef_method :sample, :shuffle, :shuffle! 
end 

まず、スコープ解決演算子を使用するのは間違っていました。 )

module Kernel 
    undef_method :rand, :srand 
    class << self 
    undef_method :rand, :srand 
    end 
end 

class Random 
    undef_method :rand, :srand, :seed 
    class << self 
    undef_method :rand, :srand, :new 
    end 
end 
関連する問題