Scala permite definir funções de ordem superior. Tais funções recebem outras funções como parâmetros, ou resultam em uma função. Por exemplo, a função apply
recebe outra função f
e um valor v
então aplica a função f
emv
:
def apply(f: Int => String, v: Int) = f(v)
Nota: métodos são automaticamente convertidos em funções se o contexto demandar.**
Outro exemplo:
class Decorator(left: String, right: String) {
def layout[A](x: A) = left + x.toString() + right
}
object FunTest extends App {
def apply(f: Int => String, v: Int) = f(v)
val decorator = new Decorator("[", "]")
println(apply(decorator.layout, 7))
}
A execução produz a saída:
[7]
Nesse exemplo, o método decorator.layout
é automaticamente convertido em um valor do tipo Int => String
conforme o método apply
demanda. Note que o método decorator.layout
é um método polimórfico (por exemplo: ele abstrai alguns tipos de sua assinatura) e o compilador Scala precisa primeiro instanciar corretamento o tipo do método.
Contributors to this page:
Contents
- Introdução
- Basics
- Tipos Unificados
- Classes
- Parâmetro com Valor Padrão
- Parâmetros Nomeados
- Traits
- Tuplas
- Composição de Classes Mixin
- Funções de ordem superior
- Funções Aninhadas
- Currying
- Classes Case
- Correspondência de Padrões
- Objetos Singleton
- Padrões de Expressões Regulares
- Objetos Extratores
- For Comprehensions
- Classes Genéricas
- Variâncias
- Limitante Superior de Tipos
- Limitante Inferior de Tipos
- Classes Internas
- Tipos Abstratos
- Tipos Compostos
- Auto Referências Explicitamente Tipadas
- Parâmetros Implícitos
- Conversões Implícitas
- Métodos Polimórficos
- Inferência de Tipo Local
- Operadores
- By-name Parameters
- Anotações
- Packages and Imports
- Package Objects