Gibt es eine Möglichkeit, die strenge Arity-Erzwingung eines Proc instanziiert zu aktivieren, der Proc.new
oder Kernel.proc
instanziiert, so dass es sich wie ein Proc verhält, der mit lambda
instanziiert wird?Kann ich Arity für einen Block erzwingen, der an eine Methode übergeben wurde?
Meine initialize
Methode nimmt einen Block &action
und weist es einer Instanzvariablen zu. Ich möchte action
streng Arity erzwingen, also, wenn ich später Argumente darauf anwende, löst es eine ArgumentError
, dass ich retten und eine sinnvollere Ausnahme auslösen kann. Grundsätzlich gilt:
class Command
attr_reader :name, :action
def initialize(name, &action)
@name = name
@action = action
end
def perform(*args)
begin
action.call(*args)
rescue ArgumentError
raise(WrongArity.new(args.size))
end
end
end
class WrongArity < StandardError; end
Leider hat action
nicht arity standardmäßig erzwingen:
c = Command.new('second_argument') { |_, y| y }
c.perform(1) # => nil
action.to_proc
nicht funktioniert, auch nicht lambda(&action)
.
Irgendwelche anderen Ideen? Oder bessere Ansätze für das Problem?
Danke!
Sie brauchen nicht auf alle '& action' zu verwenden. Löschen Sie einfach den Aktionsparameter und ersetzen Sie in der Zeile, in der Sie die Instanzvariable setzen, "action" durch "lambda". Ich habe unten ein Codebeispiel gepostet. – wrhall