sto lavorando con ActiveAttr che ti dà quel bel inizializzazione opzione di blocco tramite:Scrubbing un isolato da una chiamata a super
person = Person.new() do |p|
p.first_name = 'test'
p.last_name = 'man'
end
Tuttavia, in una classe specifica che includono ActiveAttr :: Modello, voglio ignorare questa funzionalità dal momento che voglio usare il blocco per qualcos'altro. Quindi qui si va:
class Imperator::Command
include ActiveAttr::Model
end
class MyCommand < Imperator::Command
def initialize(*args, &block)
@my_block = block
super(*args)
end
end
Questo fallisce miseramente, perché il blocco viene comunque passato a monte della catena, e, infine, all'interno di ActiveAttr, questo codice viene eseguito:
def initialize(*)
super
yield self if block_given?
end
Quindi, se la mia chiamata appare come così:
MyCommand.new() { |date| date.advance(month: 1) }
fallisce come segue:
NoMethodError: undefined method `advance' for #<MyCommand:0x007fe432c4fb80>
dal momento che MyCommand non ha alcun metodo: avanzare la chiamata a MyCommand ovviamente fallisce.
Quindi la mia domanda è questa, c'è un modo per rimuovere il blocco dalla firma del metodo prima di chiamare di nuovo super
, in modo che il blocco non viaggi oltre il mio inizializzatore forzato?
Perfetto, non so perché non ci ho pensato. Grazie! – TheDelChop
Questo deve essere un bug rubino, sebbene sia ancora presente in Ruby 2.0 – Mikey