के लिए एक कॉल जो आप देता है मैं ActiveAttr साथ काम कर रहा हूँ से एक ब्लॉक Scrubbing कि ब्लॉक विकल्प के माध्यम से अच्छा इनिशियलाइज़:सुपर
person = Person.new() do |p|
p.first_name = 'test'
p.last_name = 'man'
end
हालांकि, एक विशिष्ट वर्ग में शामिल हैं कि ActiveAttr :: मॉडल में, मैं चाहता हूँ इस कार्यक्षमता को बाईपास करें क्योंकि मैं किसी अन्य चीज़ के लिए ब्लॉक का उपयोग करना चाहता हूं। तो यहाँ हम चले:
class Imperator::Command
include ActiveAttr::Model
end
class MyCommand < Imperator::Command
def initialize(*args, &block)
@my_block = block
super(*args)
end
end
यह बुरी तरह विफल रहता है, क्योंकि ब्लॉक अभी भी श्रृंखला को पारित कर दिया जाता है, और अंत में ActiveAttr के अंदर, इस कोड को चलाने के हो जाता है:
def initialize(*)
super
yield self if block_given?
end
तो मेरी कॉल की तरह लग रहा है, तो तो: इस प्रकार
MyCommand.new() { |date| date.advance(month: 1) }
यह विफल रहता है:
NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80>
क्योंकि MyCommand के पास कोई विधि नहीं है: इसे अग्रिम करें MyCommand को कॉल स्पष्ट रूप से विफल हो जाता है।
तो मेरा सवाल यह है कि, क्या मैं एक तरीका है कि मैं super
पर कॉल करने से पहले विधि हस्ताक्षर से ब्लॉक को हटा सकता हूं, ताकि ब्लॉक मेरे ओवरराइड प्रारंभकर्ता से आगे नहीं जा सके?
बिल्कुल सही, मुझे नहीं पता कि मैंने इसके बारे में क्यों नहीं सोचा था। धन्यवाद! – TheDelChop
यह एक रूबी बग होना चाहिए, हालांकि यह अभी भी रूबी 2.0 में मौजूद है – Mikey