متغير undefine في روبي
-
18-09-2019 - |
سؤال
دعنا نقول أنا أستخدم irb
, ، واكتب a = 5
. وبعد كيف يمكنني إزالة تعريف a
بحيث الكتابة a
إرجاع أ NameError
?
بعض السياق: لاحقا أريد القيام بذلك:
context = Proc.new{}.binding
context.eval 'a = 5'
context.eval 'undef a' # though this doesn't work.
المحلول
هناك Remove_Class_Variable., refect_instance_variable. و Remove_Const. الأساليب ولكن لا يوجد حاليا أي ما يعادل المتغيرات المحلية.
نصائح أخرى
يمكنك تجنب عدم إعلان التغير عن طريق تقليل النطاق الذي يوجد فيه المتغير:
def scope
yield
end
scope do
b = 1234
end
b # undefined local variable or method `b' for main:Object
يمكنك دائما "مسح سجل IRB للمتغيرات المحلية من خلال استدعاء شغل فرعي IRB. فكر في كيفية عمل قذائف BASH فيما يتعلق بمتغيرات البيئة غير الضرورية. منذ وضع تفاعلي مستنقع، يجب أن يعمل هذا الحل من أجل ذلك.
فيما يتعلق بقانون الإنتاج، لن أرغب في إلغاء مزين بالمتغيرات المحلية كجزء من الحل - من المحتمل أن يكون التجزئة المفتاح أفضل لهذا النوع من السيناريو.
إليك ما أقصده:
$ irb
irb(main):001:0> a = "a"
=> "a"
irb(main):002:0> defined? a
=> "local-variable"
irb(main):003:0> irb # step into subshell with its own locals
irb#1(main):001:0> defined? a
=> nil
irb#1(main):002:0> a
NameError: undefined local variable or method `a' for main:Object
from /Users/dean/.irbrc:108:in `method_missing'
from (irb#1):2
irb#1(main):003:0> exit
=> #<IRB::Irb: @context=#<IRB::Context:0x1011b48b8>, @signal_status=:IN_EVAL, @scanner=#<RubyLex:0x1011b3df0>>
irb(main):004:0> a # now we're back and a exists again
=> "a"
حاليا ليس لديك وسيلة لإزالة المتغيرات العالمية والمتغيرات المحلية ومتغيرات الطبقة. يمكنك إزالة الثوابت باستخدام طريقة "إزالة_كونست" على الرغم من
في روح السؤال، يمكنك الحد من المتغير إلى النطاق، على افتراض أنك بخير مع مخالفات المتغيرات المحلية الأخرى لنظام نفس النطاق. هذا مفيد بشكل خاص إذا كنت تحدد شيئا ما في الفصل ولا تريد أن يبقى المتغير المحلي في إعلان الفصل.
الطرق الوحيدة التي يمكنني التفكير فيها للقيام بذلك Integer#times
أو Array#each
مثل ذلك:
1.times do |a|
a = 5
# code…
end
[5].each do |a|
# code…
end
ربما هناك طرق أخرى، حتى من الأنظف للحد من كتلة إلى جانب ذلك. هذه ليست نظيفة كما أردت وأحب أن أرى ما إذا كان شخص ما لديه طريقة نظافة للاستخدام للقيام بذلك.