Wie beschränke ich die Anzahl der Aufrufe eines Blocks?

8

In Wie machen Ich beschränke die Anzahl der Ersetzungen bei der Verwendung von gsub? , jemand schlug den folgenden Weg vor, um eine begrenzte Anzahl von Ersetzungen zu machen:

%Vor%

Es funktioniert, aber der Code mischt, wie oft (5) mit dem ersetzt werden soll, was die Substitution sein soll ("x", wenn es eine Substitution geben sollte, sonst $& ). Ist es möglich, die beiden zu trennen?

(Wenn es zu schwierig ist, die beiden Dinge in diesem Szenario zu trennen, aber in einigen anderen Szenarien, kann man das als Antwort schreiben)

    
Andrew Grimm 16.05.2011, 23:22
quelle

3 Antworten

8

Wie wäre es, die Ersetzung einfach als Argument zu extrahieren und den Zähler einzukapseln, indem der Block innerhalb einer Methode geschlossen wird?

%Vor%

Sie können es noch allgemeiner machen, indem Sie einen Block für die Ersetzung verwenden:

%Vor%

Jetzt kannst du Sachen wie

machen %Vor%     
hammar 16.05.2011, 23:37
quelle
2

gsub wird den Block genau so oft aufrufen, wie die Regex mit der Zeichenfolge übereinstimmt. Die einzige Möglichkeit, dies zu verhindern, besteht darin, break im Block aufzurufen, was jedoch dazu führt, dass gsub keinen aussagekräftigen Rückgabewert liefert.

Also nein, es sei denn, Sie rufen den Break im Block auf (wodurch verhindert wird, dass weiterer Code in der Yield-Methode ausgeführt wird und somit verhindert, dass die Methode irgendeinen Wert zurückgibt), die Anzahl der Aufrufe einer Methode durch die Methode selbst. Wenn Sie gsub also nur 5 Mal erhalten möchten, können Sie nur eine Regex übergeben, die nur fünf Mal mit den angegebenen Zeichenfolgen übereinstimmt.

    
sepp2k 16.05.2011 23:38
quelle
1

Warum benutzt du gsub() ? Durch sein Design ist gsub dazu gedacht, alle Vorkommnisse von etwas zu ersetzen, also kämpfen Sie sofort damit.

Verwenden Sie stattdessen sub :

%Vor%     
the Tin Man 17.05.2011 03:36
quelle

Tags und Links