मैं वर्तमान कक्षा के संदर्भ में निष्पादित करने के लिए कोड लिखने के लिए class_eval
का उपयोग कर रहा हूं। निम्नलिखित कोड में, मैं विशेषता मानों के परिवर्तनों के लिए एक काउंटर जोड़ना चाहता हूं। मेरे मामले में, class Foo
के तहत -'class_eval` स्ट्रिंग के भीतर परिवर्तनीय दायरा क्या है?
class Class
def attr_count(attr_name)
attr_name = attr_name.to_s
attr_reader attr_name # create the attribute's getter
class_eval %Q{
@count = 0
def #{attr_name}= (attr_name)
@attr_name = attr_name
@count += 1
end
def #{attr_name}
@attr_name
end
}
end
end
class Foo
attr_count :bar
end
f = Foo.new
f.bar = 1
class_eval
की मेरी समझ है कि यह क्रम वर्ग के संदर्भ में ब्लॉक मूल्यांकन करता है।
class Foo
attr_count :bar
@count = 0
def bar= (attr_name)
@attr_name = attr_name
@count += 1
end
def bar
@attr_name
end
end
हालांकि इसके बाद के संस्करण कोड त्रुटि हुई कह रही है, त्रुटि @count += 1
के कारण होता है: मैं ऊपर कोड रन रूप में इसी तरह की उम्मीद है। मुझे पता नहीं लगा सकता कि @count
में nil:NilClass
है इसके सुपर के रूप में?
(eval):5:in `bar=': undefined method `+' for nil:NilClass (NoMethodError)
दूसरी ओर, @selman उदाहरण विधि के भीतर @count
काम डाल करने के लिए एक समाधान दिया है और यह काम करता है।
class Class
def attr_count(attr_name)
#...
class_eval %Q{
def #{attr_name}= (attr_name)
@attr_name = attr_name
if @count
@count += 1
else
@count = 1
end
end
#...
}
end
end
वेरिएबल स्कोप काम क्यों बदलता है? class_eval
इसकी निम्न स्ट्रिंग निष्पादित कैसे करता है?
आपको अपनी CS169 कक्षा कैसा लगा? :) –