असल
severin
है: हालांकि, अगर आपकी @attributes कभी नहीं आरंभीकरण के बाद बदल सकते हैं और आप गति की जरूरत है, तो आप इसे इस तरह से कर सकता है बेहतर विचार, सिर्फ इसलिए कि method_missing का उपयोग एक बुरा अभ्यास है, हर समय नहीं, लेकिन इसमें से अधिकांश।
severin
द्वारा प्रदान किए गए कोड के साथ एक समस्या: यह प्रारंभिककर्ता को पास किया गया मान देता है, इसलिए आप इसे बदल नहीं सकते हैं। मैं तुम्हें एक छोटे से अलग दृष्टिकोण का सुझाव:
class User < Hash
def initialize(attrs)
attrs.each do |k, v|
self[k] = v
end
end
def []=(k, v)
unless respond_to?(k)
self.class.send :define_method, k do
self[k]
end
end
super
end
end
चलो यह जाँच:
u = User.new(:name => 'John')
p u.name
u[:name] = 'Maria'
p u.name
और यह भी आप Struct के साथ यह कर सकते हैं:
attrs = {:name => 'John', :age => 22, :position => 'developer'}
keys = attrs.keys
user = Struct.new(*keys).new(*keys.map { |k| attrs[k] })
चलें परीक्षण:
p user
p user.name
user[:name] = 'Maria'
p user.name
user.name = 'Vlad'
p user[:name]
या यहां तक कि ओपनस्ट्रक्चर, लेकिन सीए यह विधि नहीं बनाएगा, यदि वह पहले उदाहरण के तरीकों में यह राशि REFUL, आप OpenStruct.instance_methods
का उपयोग करके कि लिए देख सकते हैं (प्रकार की वजह से, मैं अब दूसरा दृष्टिकोण का उपयोग कर रहा प्रयोग किया जाता है):
attrs = {:name => 'John', :age => 22, :position => 'developer'}
user = OpenStruct.new(attrs)
हां, इतना आसान :
user.name
user[:name] # will give you an error, because OpenStruct isn't a Enumerable or Hash
OpenStruct (मानक पुस्तकालय में struct.rb) को देखने के लिए सुनिश्चित करें। यह आप जो पूछ रहे हैं उससे थोड़ा अलग है: यह ओपनस्ट्रक्चर पर किसी भी विधि कॉल को एक्सेसर होने की अनुमति देता है, चाहे वह पहले ही परिभाषित हो या नहीं। लेकिन यह कोड है जिसे आपको लिखना नहीं है, जो कभी-कभी प्लस हो सकता है। –