Я пишу код для докторской диссертации и начинаю использовать Scala. Мне часто приходится заниматься обработкой текстов. Я привык к Python, чье утверждение 'yield' чрезвычайно полезно для реализации сложных итераторов над большими, часто нерегулярно структурированными текстовыми файлами. Схожие конструкции существуют и в других языках (например, C#), не зря.
Да, я знаю, что были и предыдущие потоки по этому поводу. Но они выглядят как взломанные (или, по крайней мере, плохо объясненные) решения, которые явно не работают хорошо и часто имеют непонятные ограничения. Хотелось бы написать что-то вроде этого:
import generator._
def yield_values(file:String) = {
generate {
for (x <- Source.fromFile(file).getLines()) {
# Scala is already using the 'yield' keyword.
give("something")
for (field <- ":".r.split(x)) {
if (field contains "/") {
for (subfield <- "/".r.split(field)) { give(subfield) }
} else {
// Scala has no 'continue'. IMO that should be considered
// a bug in Scala.
// Preferred: if (field.startsWith("#")) continue
// Actual: Need to indent all following code
if (!field.startsWith("#")) {
val some_calculation = { ... do some more stuff here ... }
if (some_calculation && field.startsWith("r")) {
give("r")
give(field.slice(1))
} else {
// Typically there will be a good deal more code here to handle different cases
give(field)
}
}
}
}
}
}
}
Хотелось бы посмотреть код, реализующий функции generate() и give(). BTW give() должна быть названа yield(), но Scala уже взяла это ключевое слово.
Я понял, что по непонятным мне причинам продолжения Scala могут не работать внутри оператора for. Если да, то функция generate() должна поставлять эквивалентную функцию, которая работает как можно ближе к оператору for, так как код итератора с yield почти неизбежно сидит внутри цикла for.
Пожалуйста, я бы предпочел не получать ни одного из следующих ответов: