Первый вопрос: является ли стрелка антипаттерном в Scala?
Я перехожу с Java на Scala около 3 месяцев. Я начинаю понимать, что шаблон «анти-стрелка» является чем-то вроде стандарта в Scala.
Например, в Java я люблю как можно скорее возвращаться из методов. Мы не любим много внутренних вложений. Если у вас их много, это называется антипаттерном стрелки. Вы можете прочитать об этом здесь: http://c2.com/cgi/wiki?ArrowAntiPattern
Пример Java:
boolean isValid(String input){
if (input.trim().length() <1) return false //return early
if (input.substring(0,3).equals("sth")) return false;
//do some more checks for validity then return true
return true
}
Если бы я написал это на Scala, мне пришлось бы использовать операторы совпадений, что привело бы к большим отступам. Имейте в виду, что это всего лишь фиктивный пример, в котором я пытаюсь передать только вложение и отступы Scala.
def isValid(input:String): Boolean = {
(input.trim.length < 1) match {
case true =>
input.substring(0,3) match {
case sthCase if(sthCase=="sth") =>
//do some more checks etc
//eventually arrive at the "true" branch
... case valid => true
case sthElse if (sthCase=="bla") => //some more code etc
case _ => false
}
case _ => false
}
}
Я знаю, что этот пример можно было бы написать так же, как я написал пример для Java, но если бы вместо того, чтобы возвращать истину или ложь, я хотел бы присвоить это значение переменной, например: val valid = (input.trim.length < 1) match ...
, тогда это единственный способ сделать это, поскольку вы можете ' t переназначить val. Я мог бы использовать var
вместо val
, но тогда я бы использовал Java вместо Scala.
Повторяемый вопрос: Итак, вопрос в том, является ли антипаттерн стрелки способом делать что-то в Scala или я что-то упускаю? Есть ли лучший способ сделать в Scala то, что я только что написал (имея в виду, что я хочу, чтобы результат оператора сопоставления был назначен переменной val
).