2016-08-03 4 views
1

Ich habe ein bisschen alten Code in einer Legacy-App, die yield in einer Weise verwendet, die ich nicht verstehe. Ich könnte Hilfe mit einer Erklärung gebrauchen. Ich habe die meisten SO-Ergebnisse zu Ruby yield gelesen, verstehe sie aber in diesem Zusammenhang nicht. Vielen Dank.Was bewirkt die Ausbeute in dieser Ruby-Methode?

def find_all_from_source(source_id) 
    joins, conditions = invoke_records_from_source(source_id) 
    find(:all, :select => “#{self.table_name}”, :joins => joins, :conditions => conditions).each do |record| 
    yield record 
    end 
end 

result = {} 
model.find_all_from_source(source_id) do |r| 
    result[r.id] = {'attribute' => r.attribute } 
end 
+0

So habe ich einige Codes im Zusammenhang mit dem Kommentar, der über fehlenden Block gemacht @sergio. – jmscholen

Antwort

2

find_all_from_source ist offenbar gemeint, mit einem Block aufgerufen werden, die die zurückgegebenen Datensätze von find in irgendeiner Weise verarbeitet. Die yield ruft diese Blöcke für jeden Datensatz auf.

Diese Methode diese unidiomatic Weise geschrieben wurde, konnte Rubys schwer folgen implizit Block Syntax zu vermeiden:

def find_all_from_source(source_id, some_more_arguments, &block) 
    joins, conditions = invoke_records_from_source(source_id, some_more_arguments) 
    find(:all, :select => “#{self.table_name}”, :joins => joins, :conditions => conditions).each do |record| 
    block.call record 
    end 
end 
+1

"Ich würde erwarten, dass es scheitert" - es sei denn, 'find' gibt nichts zurück, was den Fehler verbirgt. Oder vielleicht dachte er, dass der Block ein unbedeutendes Detail ist, und versteckte es hinter 'some_more_arguments'. –

+0

Mit dem hinzugefügten Codeblock wird der 'yield record' durch' do | r | ersetzt result [r.id] = {'attribute' => r.attribute} Ende' Code-Block? @SergioTullensev @DaveSchweisguth – jmscholen

+0

Nicht "ersetzt", genau, aber ja, der Block läuft an diesem Punkt mit dem Blockparameter 'r' auf das Argument gesetzt, um' yield', 'record'. –