Predpokladajme, že chceme, aby niekto napísal svoju vlastnú pseudonáhodnú metódu. Ako programovacie cvičenie. A chceme upozorniť na chybu pri každom pokuse vyriešiť zabudované funkcie ako skratku.
Zatiaľ som to urobil:
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
Blokuje teda Náhodné a vyvolávajú chybu:
rand
srand
Random.new.rand(18)
ale nefunguje s pseudonáhodnými metódami poľa
[1,2,3].shuffle!
Stále funguje. Prečo k tomu dôjde a ako tomu zabrániť?
odpovede:
2 pre odpoveď č. 1Môžete otvoriť triedu a nahradiť metódy, ktoré chcete zakázať ...
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
2 pre odpoveď č. 2
Váš kód dostal chybu
ArgumentError: wrong number of arguments (0 for 1..4)
ale pre ďalšie podobné funkcie modulu môžete jednoducho definovať metódy ako
methods_to_block = ["rand", "srand","seed", "sample", "shuffle!", "shuffle!"]
malo by to vyzerať
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"]
Teraz, keď zavoláte
> srand
RuntimeError: Usage of built-in random generators is not allowed
> rand
RuntimeError: Usage of built-in random generators is not allowed
Dúfam, že vám to pomôže
Ak sa chcete držať, zostaňte pri svojom
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
Teraz môžete získať všetky
> 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 pre odpoveď č. 3
Ok. Toto funguje:
class Array
undef_method :sample, :shuffle, :shuffle!
end
Používanie operátorov rozlíšenia rozsahu bolo na začiatku nesprávny nápad. Iba vytvárajú konštanty vo vnútri tried namiesto predefinovania metód
Spr
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