/ / ऐरे वर्ग में फेरबदल और नमूना अक्षम करना - माणिक

ऐरे क्लास में शफल और नमूना को अक्षम करना - रूबी

मान लें कि हम चाहते हैं कि कोई व्यक्ति अपने स्वयं के छद्म रूप से लिखने की विधि का उपयोग करें। प्रोग्रामिंग अभ्यास के रूप में। और हम हर बार शॉर्टकट के रूप में अंतर्निहित कार्यों को हल करने का प्रयास करने के लिए एक त्रुटि उठाना चाहते हैं।

अब तक, मैंने यही किया है:

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 № 1

आप कक्षा खोल सकते हैं और उन तरीकों को बदल सकते हैं जिन्हें आप अक्षम करना चाहते हैं ...

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 № 2

आपके कोड में त्रुटि हो रही थी

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

लेकिन मॉड्यूल कार्यों की तरह अन्य के लिए आप बस की तरह तरीकों को परिभाषित कर सकते हैं

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

यह दिखना चाहिए

 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"]

अब अगर तुम बुलाओ

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

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

आशा है इससे आपकी मदद होगी

यदि आप छड़ी करना चाहते हैं तो अपने तरीके से बने रहें

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

अब आप सब प्राप्त कर सकते हैं

> 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 № 3

ठीक। यह काम:

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