_ >= 0.70
- функция, которая сравнивает свой элемент с 0,70. обессахаривая _
, это будет выглядеть как value => value >= o.70
Компилятор понимает _ chk_val
как вызов chk_val
постфиксной нотации для всего, что передается в функцию. Без шугаринга это будет выглядеть как value => value.chk_val
Очевидно, что в Double нет члена chk_val
- и это именно то, что вам сообщает компилятор.
Итак, _
не является black magi c - он не просто волшебным образом разбирает строку и превращает ее в исполняемый код :) Чтобы получить условие из файла конфигурации, вам нужно будет преобразовать его в функцию - наверное, самый простой ( и рискованно, и, вероятно, компилятор не будет проверять его тип) заключается в использовании какой-то функции eval
(например, см. этот ответ или этот вопрос ).
Более быстрый, простой и понятный (но, вероятно, менее гибкий и менее масштабируемый) подход состоит в том, чтобы, вероятно, определить парсер самостоятельно. Что-то вроде:
def parseCondition(input: String): Double => Boolean = {
val splitInput = input.split(" ")
// You might want to add some validation - e.g. ">=0.7" will just throw here
val (operator, operand) = (splitInput.first, splitInput.last)
operator match {
case ">=": _ >= operand
case ">": _ > operand
case "<": _ < operand
...
}
}
Или, может быть, использовать Atto ::