bir çağrı bir blok Ovma blok seçeneği aracılığıyla güzel initialize o:verir ben ActiveAttr ile çalışıyorum süper
person = Person.new() do |p|
p.first_name = 'test'
p.last_name = 'man'
end
Ancak ActiveAttr :: Modeli dahil belirli sınıfta, ben istiyorum bloğu başka bir şey için kullanmak istediğimden bu işlevi atla. İşte başlıyoruz:
def initialize(*)
super
yield self if block_given?
end
Yani benim çağrı gibiyse: blok hala zinciri iletilir ve sonunda ActiveAttr içini, bu kod çalıştırmak alır çünkü bu, sefil başarısız
class Imperator::Command
include ActiveAttr::Model
end
class MyCommand < Imperator::Command
def initialize(*args, &block)
@my_block = block
super(*args)
end
end
böylece aşağıdaki
MyCommand.new() { |date| date.advance(month: 1) }
başarısız olarak:
NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80>
MyCommand'ın hiçbir yöntemi olmadığından, MyCommand'a yapılan çağrı açıkça başarısız oluyor.
Bu yüzden sorum şu: blok yeniden super
'u aramadan önce yöntem imzasından kaldırmamın bir yolu var, böylece blok geçersiz kılınmış başlatıcımdan başka bir yere gitmiyor mu?
Mükemmel, Neden bunu düşünmediğimi bilmiyorum. Teşekkürler! – TheDelChop
Bu Ruby 2.0 hala mevcut olmasına rağmen, bu bir yakut böcek olmalı – Mikey