-Code
def split_description(description, first_n)
@description_first, @description_remain =
case description.count("\n")
when 0..first_n
[description, '']
else
partition_description(description, first_n)
end.map(&:to_html)
end
def partition_description(description, first_n)
return ['', description] if first_n.zero?
offset = 0
description.each_line.with_index(1) do |s,i|
offset += s.size
return [description[0,offset], description[offset..-1]] if i == first_n
end
end
ich to_html('') #=> ''
angenommen habe, aber wenn das nicht der ist Falls die Änderung einfach ist.
Beispiel
Damit wir die Wirkung von to_html
sehen können, machen wir es auf diese Weise definieren.
def to_html(description)
description.upcase
end
description =<<_
It was the best of times
it was the worst of times
it was the age of wisdom
it was the age of fools
_
split_description(description, 0)
@description_first
#=> ""
@description_remain
#=> "IT WAS THE BEST OF TIMES\n..WORST OF TIMES\n..AGE OF WISDOM\n..AGE OF FOOLS\n"
split_description(description, 1)
@description_first
#=> "IT WAS THE BEST OF TIMES\n"
@description_remain
#=> "IT WAS THE WORST OF TIMES\n..AGE OF WISDOM\n..AGE OF FOOLS\n"
split_description(description, 2)
@description_first
#=> "IT WAS THE BEST OF TIMES\nIT WAS THE WORST OF TIMES\n"
@description_remain
#=> "IT WAS THE AGE OF WISDOM\nIT WAS THE AGE OF FOOLS\n"
split_description(description, 3)
@description_first
#=> "IT WAS THE BEST OF TIMES\n..WORST OF TIMES\n..AGE OF WISDOM\n"
@description_remain
#=> "IT WAS THE AGE OF FOOLS\n"
split_description(description, 4)
@description_first
#=> "IT WAS THE BEST OF TIMES\n..WORST OF TIMES\n..AGE OF WISDOM\n..AGE OF FOOLS\n"
@description_remain
#=> ""
Erklärung
Zuerst erscheint, ist, dass description
eine lokale Variable ist eine Zeichenfolge zu halten. Wenn ja, muss es ein Argument der Methode sein (zusammen mit first_n
).
def split_description(description, first_n)
Wir wollen Werte zu zwei Instanzvariablen zuweisen, so lassen beginnen die durch
Schreiben
@description_first, @description_remain =
Es gibt wirklich zwei Schritte: die gewünschten Strings zu erhalten und Abbilden sie dann mit to_html
. Konzentrieren wir uns also zunächst auf den ersten Schritt.
Wir werden nun Zustand auf die Anzahl der Zeilen in der Zeichenfolge
case description.count("\n")
Lassen Sie uns zunächst mit dem Fall befassen, wo die Zeichenfolge keine Zeilenumbrüche enthält
when 0
[description, '']
Wenn die Zeichenfolge leer ist dies wird sei ['', '']
; Andernfalls enthält es eine einzelne Zeichenfolge ohne Zeilenumbruch.
Angenommen, die Anzahl der Zeilenumbrüche in der Zeichenfolge liegt zwischen 1 und first_n
. In diesem Fall soll @description_first
der gesamte String sein und @description_remain
soll leer sein.
when 1..first_n
[description, '']
Da beide when 0
und when 1..first_n
geben den gleichen Array mit zwei Elementen, können wir sie kombinieren:
when 0..first_n
[description, '']
so weit zu kommen, first_n
ist kleiner als die Anzahl von Zeilenumbrüchen. Ich habe eine andere Methode für den Fall verwendet, bei dem die Anzahl der Zeilenumbrüche größer als first_n
ist.
else
partition_description(description, first_n)
partition_description
bestimmt einfach den Versatz in description
des first_n
ten Newline und dann partitioniert die Zeichenfolge entsprechend.
Schließlich müssen wir den Fall Anweisung beenden, Karte die Anordnung von zwei Strings zurück mit to_html
und das Verfahren beenden
end.map(&:to_html)
end
Wie ich bereits erwähnt, habe ich to_html('') #=> ''
angenommen. Das scheint mir der beste Ort zu sein, um mit leeren Saiten umzugehen.
Beachten Sie, dass ich mich direkt mit der Zeichenfolge beschäftigt habe, anstatt die Zeichenfolge in Zeilen aufzuteilen, die Zeilen zu bearbeiten und sie dann wieder einzufügen.
Tatsächlich tut es! Netter, Eric. Bei Verwendung mit dem Beispiel in meiner Antwort erhalten wir die gleichen Ergebnisse. Sie machen sich die Tatsache zunutze, dass [1,2] .take (99) # => [1, 2] 'und' [1,2] .drop (99) # => [] 'machen können Es ist eine Herausforderung für den Leser zu verstehen, was vor sich geht. Ich schlage nicht vor, dass Sie das ändern, aber vielleicht fügen Sie einen oder zwei Kommentare hinzu, um zu klären. Was sage ich? Ein Kommentar in einer Methode, die an SO gesendet wurde? –