Capitulo 2 – Construtores e Traits

Introdução

Neste capitulo, iremos abordar:

  • Construtores
  • Traits

Sempre no tom de levar a simplicidade e didática a este “blogbook”, se você ainda não viu o Capítulo 1, ainda há tempo de você clicar neste link e ver ou rever o básico da introdução da Linguagem.

Construtores

Construtores é um dos recursos mais importantes dentro da Orientação a Objetos, eles definem qual o “formato” inicial que um objeto terá, este formato, pode ser a inicialização de alguns atributos, ou mesmo toda a definição de um ou vários comportamentos (métodos).

Entendendo Classes vs Objetos

Uma das melhores explicações que eu aprendi para ensinar esta diferença as pessoas resume-se a abstração de uma: Receita e o Bolo! Parece engraçado, mas se você pensar, na receita estão definidos todos os atributos (quantidade de leite, trigo, ovos, essencias etc), bem como os métodos (leve ao forno, por X tempo , desenforme, cubra com algo). Neste caso, estamos dizendo então que a classe é nada mais que a receita, e os objetos são como os inúmeros bolos que podem ser construídos, a partir da receita.

Em Scala, você já pode definir um dos construtores a partir da declaração da classe:


package capitulo2

class Veiculo(marca:String, modelo:String) {

override def toString = marca.+(" , ").+(modelo)

}

Na classe acima, nós estamos definindo um construtor com 2 atributos String:

  • Marca
  • Modelo

Estes por sua vez são utilizados no método “sobrescrito”(override) toString. Na nossa classe capitulo2.Application você pode ver o funcionamento de nosso exemplo:


package capitulo2;

object Application {
 var veiculo = new Veiculo("Ford","Marverick")

 def main(args: Array[String]) {

Console.println("#############################");
Console.println(" Scala Tutorial = Capitulo 2     ");
Console.println("#############################");

Console.println(veiculo)
 }
}

O Resultado é:


#############################
 Scala Tutorial = Capitulo 2
#############################
Ford , Marverick

Mais de um Construtor

Em inúmeras circunstâncias precisamos de mais de um construtor em uma classe, em Scala, nós pensamos mais em Construtores Auxiliares do que em uma método de construção totalmente diferente,  imagine que na nossa classe Veiculo, agora nós queremos passar uma única um Integer como Marca e nada mais. Veja então abaixo a nova definição:

package capitulo2

class Veiculo(marca:String, modelo:String) {

 def this(marcaId:Integer) = this( {if (marcaId == new Integer(1)) "Ford" else "Not Found"},

 "Not Specified Model Yet" )

 override def toString = marca.+(" , ").+(modelo)

}

Na instrução acima, nós somos sempre obrigados a invocar o construtor definido junto com a classe, mas veja que no caso acima, nós usamo o Inteiro(marcaId) para buscar um valor para o primeiro parametro (marca do tipo String) do construtor oficial. Uma vez isto alterado, vamos agora testar nossa classe:


object Application {

 var veiculo1 = new Veiculo("Ford","Marverick")
 var veiculo2 = new Veiculo(1)

 def main(args: Array[String]) {

 Console.println("#############################");
 Console.println(" Scala Tutorial = Capitulo 2     ");
 Console.println("#############################");

 Console.println(veiculo1)
 Console.println(veiculo2)
 }
}

Veja o resultado que é exibido após a execução desta classe:

#############################
 Scala Tutorial = Capitulo 2
#############################
Ford , Marverick
Ford , Not Specified Model Yet

Na saída de código, você vê o resultado da chamada diferente dos Construtores, neste caso, o oficial e o auxiliar.

Validando o Construtor

Quantas vezes em Java, C# ou outras linguagens devemos checar os valores dos atributos, em Scala, você tem como validar o seu construtor de forma bastante eficiente, observe as alterações feitas em nossa classe Veículo:


package capitulo2

class Veiculo(marca:String, modelo:String) {

 require(marca!=null && modelo!="NIVA")

 def this(marcaId:Integer) = this( {if (marcaId == new Integer(1)) "Ford" else "Not Found"},

 "Not Specified Model Yet" )

 override def toString = marca.+(" , ").+(modelo)

}

Com a instrução required, podemos controlar exatamente o que aceitamos ou não para a construção do objeto, neste caso, não podemos aceitar a marca como null e nem o modelo como Niva.  Se testarmos nossa classe de teste capitulo2.Application:


object Application {

 var veiculo1 = new Veiculo("Ford","Marverick")
 var veiculo2 = new Veiculo(1)
 var veiculo3 = new Veiculo(null,"NIVA");

 def main(args: Array[String]) {

 Console.println("#############################");
 Console.println(" Scala Tutorial = Capitulo 2     ");
 Console.println("#############################");

 Console.println(veiculo1)
 Console.println(veiculo2)
 }
}

O resultado da execução será este:


Exception in thread "main" java.lang.ExceptionInInitializerError
 at capitulo2.Application.main(Application.scala)
Caused by: java.lang.IllegalArgumentException: requirement failed
 at scala.Predef$.require(Predef.scala:133)
 at capitulo2.Veiculo.(Veiculo.scala:5)
 at capitulo2.Application$.(Application.scala:9)
 at capitulo2.Application$.(Application.scala)
 ... 1 more

A mesma coisa aconteceria se você também tentasse desta forma construir o veiculo3:

	var veiculo3 = new Veiculo("Ford","NIVA");

Traits

Para quem domina o inglês alguns termos fazem total sentido, sempre achei complexo ensinar o que uma Interface significa com esse nome, pois não significa algo de uma semantica tão lógica, já trait (traço, peculiariedade, feição característica) faz muito mais sentido. Pois bem, Traits são como Interfaces em Java ou C#, com uma diferença:

  • Em Java, as Interfaces definem apenas métodos e não implementações, já nas Traits em Scala, você além da declaração pode ter também implementações.

Com base na informação acima, você pode se perguntar: “Ué, então lembra uma classe abstrata?”, a resposta é: Não! Pelo seguinte aspecto: Numa classe abstrata, você mantém o compromisso hierarquico, já numa Trait, você não precisa obedecer esse vínculo, ou seja, se você define uma estrutura de veículos, e você define um atributo do tipo Motor, lembre-se que não são apenas veículos que possuem Motores, ou você já viu alguém guardando um Liquidificador ou Motoserra no estacionamento do Shopping? Por mais que estas duas classes devam possuir o atributo Motor , elas não precisam herdar isto de Veículos , uma vez que elas podem implementar a Trait Motor . Isto gera um conceito bastante visto em linguagens como Ruby, conhecido como Mixings(Misturas).

Veja agora o exemplo de nossa Trait: Motor na seguinte porção de código:

package capitulo2

trait Motor {
	
	var nome : String;
	
	var combustivel: String;
	
	def ligar(); 
	
	def desligar();

}

Agora, vamos criar uma classe de veiculos Esportivos, para isso vamos extender a classe Veiculo “com” um Motor (Onde você leria extender X implementando y, pode ficar mais simples trocar o implementar pelo com):


package capitulo2

class Esportivo(marca:String,modelo:String) extends Veiculo(marca,modelo) with Motor {
	
	override var combustivel= "FLEX"
	override var nome="AP"
	
	override def ligar() {
		println( ".... Ligando Motor... wruuuunnnn.....")
	} 
	
	override def desligar(){
		println(".... Motor Desligado")
	}

}

Observe que ao herdarmos a classe, temos que tomarmos cuidado com a questão de seu construtor como é visto acima, bem como realizar a sobrecarga ou sobrescrever (override) os métodos da nossa Trait Motor.

Veja nossa classe capitulo2.Application, adaptada para nosso exemplo:


object Application {
	
	var veiculo1 = new Veiculo("Ford","Marverick")
    var veiculo2 = new Veiculo(1)
	var veiculo3 = new Esportivo("VOLKS","GOL");
	
	def main(args: Array[String]) {
		
		Console.println("#############################");
		Console.println(" Scala Tutorial = Capitulo 2     ");
		Console.println("#############################");
		
		Console.println(veiculo1)
		Console.println(veiculo3)
		
		veiculo3 .ligar()
		veiculo3.desligar()
		
	}
}

Veja o output:


#############################
 Scala Tutorial = Capitulo 2     
#############################
Ford , Marverick
VOLKS , GOL
.... Ligando Motor... wruuuunnnn.....
.... Motor Desligado

Classes Abstratas

Em Scala, também existem classes abstratas, como em Java e C#, para definir uma classe como abstrata, você vai usar a mesma palavra reservada abstract, sua classe vai perder a chance de ser instanciada, e vai ser servir apenas como ponto de partida para suas derivações (filhos). Porém, neste caso, Classes abstratas e traits, como já foi dito, tem a grande diferença no que tange o “vínculo hierárquico”, nem sempre, você vai querer ou precisar deste vínculo, bem como, muitas vezes ele é incorreto. Se você quiser estabelecer um vínculo hierarquico, associado a um padrão de comportamento definido pela Trait, você pode criar uma classe abstrata que extenda a Trait, desta forma, você consegue trazer o comportamento e vinculo hierarquico, caso isto seja necessário.

Você também, consegue gerar herança entre Traits, como no exemplo abaixo:

package capitulo2

trait MotorEletrico extends Motor {
	
	val voltagem_220: String = "220"
	val voltagem_110: String = "110"
		
	def carregar(voltagem:String) = {
		
		if (voltagem eq voltagem_220) {
			println("Carregando em 3 segundos...")
			Thread.sleep(3000)
			
		} else {
			println("Carregando em 5 segundos...")
			Thread.sleep(5000)
		}
		
		println("Carregado 100%");
		
	}	
		

}

Veja agora nosso carro Ecologico em Ecologico.scala:

package capitulo2

class Ecologico(marca:String,modelo:String) extends Veiculo(marca,modelo) with MotorEletrico {
	
    override var combustivel= "Eletricidade"
	override var nome="BD"
	
	override def ligar() {
		println( ".... Ligando Motor...zuuuuuumuuuuuuuu.....")
	} 
	
	override def desligar(){
		println("....dzzzz  Motor Desligado")
	}

}

Alterando nossa classe exemplo capitulo2.Application:


object Application {
	
	var veiculo1 = new Veiculo("Ford","Marverick")
    var veiculo2 = new Veiculo(1)
	var veiculo3 = new Esportivo("VOLKS","GOL");
	var veiculo4 = new Ecologico("TOYOTA","ECOCAR");
	
	def main(args: Array[String]) {
		
		Console.println("#############################");
		Console.println(" Scala Tutorial = Capitulo 2     ");
		Console.println("#############################");
		
		Console.println(veiculo1)
		Console.println(veiculo3)
		
		Console.println(veiculo4)
		
		
		veiculo3 .ligar()
		veiculo3.desligar()
		
		veiculo4.carregar("220");
		
	}
}

O Resultado é o seguinte:

#############################
 Scala Tutorial = Capitulo 2     
#############################
Ford , Marverick
VOLKS , GOL
TOYOTA , ECOCAR
.... Ligando Motor... wruuuunnnn.....
.... Motor Desligado
Carregando em 3 segundos...
Carregado 100%

Existem ainda vários outros recursos interessates no uso de Traits, principalmente para aqueles que gostam de criar DSLs (Domain Specific Languages) através de Fluent Interfaces, APIs que fazem com que os usuários possam sentir um real prazer em usá-las, por exemplo:

var application: Application = {
   Configure.with.xml("rs.xml").reloadable(true).each(15).seconds
}
//ou
var intance: ProcessIntance = {
       Engine.run(application).jbpm.name("RequestTravel").instance(id)
}

Por hora, acredito que o que vimos até aqui sobre este assunto, será suficiente para lhe ajudar no seu aprendizado com Scala.

Functions

Devido ao tamanho do capítulo 2, vamos mover Functions, e os motivos pelos quais podemos chamar Scala de uma linguagem funcional, para o próximo capítulo.

Posted in Uncategorized | Leave a comment

Capítulo 1 – Introdução

Introdução

Como não é novidade,  a máquina virtual Java não conhece a linguagem Java! Sim, ela conhece os bytecodes! E estes por sua vez podem ser gerados a partir de várias linguagens, entre elas: JavaScript, Ruby, Python, Groovy e Scala , este conceito é análogo ao CLR(Common Language Runtine) da Plataforma .Net .  Linguagem de Programação é algo muitas vezes tão pessoal quanto seu time de futebol, eu tentei várias vezes usar Ruby, mas nada nele me encantou ou chamou tanto a atenção. Eu ainda consigo fazer qualquer coisa, desde atender meus clientes até extensões para controlar meu boxee e AppleTV da minha casa com Java, mas eu resolvi revisitar Scala mais uma vez, a primeira vez em 2009, não foi um contato que me fizesse investir algum tempo nela. E por que hora bolas eu estou começando o primeiro de vários posts sobre Scala? Simplesmente porque eu acredito que exitem potencialidades ainda não exploradas dentro da JVM, e estas são totalmente disponíveis para os programas feitos com Scala, e não somente Aplicações Web ou “Cool” Websites .  Tais recursos veremos no decorrer do tempo que eu tenha para continuar esta série de tutoriais.

Quando em aprendi Java (1997/98 nem lembro) era obrigado a programar no bloco de notas,  isso era bom por um lado, eu tinha que escrever exatamente tudo como tinha que ser,  e conhecia bastante os truques do java -cp …. , javaw -cp (Aplicações Swing) etc, já que vivemos a era dos IPhones, IPads, geração Y, eu não acredito que as pessoas devam sofrer novamente para aprender alguma linguagem, tão pouco, a forma de aprendizado deva ser dolorida, portanto, todo os tutorias são feitos usando Eclipse com o plugin Scala-IDE, o qual em próximas seções veremos como é possível instalar no seu Eclipse.

O Trauma

Como mencionei anteriormente, a primeira vez que vi Scala (2009), me deu medo,  poucas vezes li algum código e não consegui entender nada! Como eu odeio videogames daqueles que se joga literalmente,  resolvi pegar Scala como um “game” a ser “zerado”, e o resultado das fases deste jogo, eu irei publicar aqui, para ajudar pessoas a não terem o mesmo trauma e susto que eu tive.  Esta série de tutoriais, que tomei a iniciativa de começar pra mim é também uma das maneiras mais prazerosas de aprender: Compartilhando conhecimento. Mas se você quiser contribuir de alguma forma com este espaço, não hesite em me contacatar @jedgarsilva.

Instalando Plugin Scala IDE no Eclipse

Nesta página: http://www.assembla.com/wiki/show/scala-ide/Requirements_and_Installation você irá encontrar todas as informações para instalar o suporte de Scala no seu usual IDE Java: Eclipse, recomendo você usar no Galileo ou Ganymed, pois no Helios eu tive uns problemas.  Com isto você irá poder criar novos projetos, syntax hightlight, code completion etc.

Pré-Requisitos

Eu vou assumir que todos que vão acompanhar estes tutoriais conheçam um pouco de Java ou C#, e claro, seria muito bem vindo conhecimento real de Orientação a Objetos.

O famoso Início : O Arquivo .scala

Diferentemente o arquivo .java para Java, o arquivo .scala é o arquivo onde você define quantas classes você quiser,  sejam estas classes Abstratas, públicas e etc.

Os pacotes

Similar ao Java e ao C#, você define sua estrutura de pacotes através de pastas, até aí não muda nada, a palavra reservada para compor uma pacote é package, ex:

package com.wordpress.altascala 

Para importar um pacote, usamos a mesma palavra reservada do Java e C#: import :

import scala.xml._

- O exemplo acima, importa todo o pacote scala.xml.* (Java).

Um recurso interessante é o poder recursivo do import em Scala,  por exemplo, no pacote acima: Todas as classes do pacote scala.xml já estão disponíveis para as classes do seu arquivo .scala, porém dentro deste pacote é o subpacote “transform”, que em java ficaria : import scala.xml.transform.*; Em Scala isto fica muito mais simples:

import transform._

Aqui, eu vou criar a primeira convenção para ajudar você nunca se perder nos seus códigos, caso você passe pela situação , eu recomendo a seguinte convenção:

/* import.begin */

import com.loja.veiculos._
import pesados._
import scania._

/* .end */

Com isto, você pode evitar de se perder em seus primeiros programa Scala

Definindo uma Classe

Definir uma classe em Scala é extremamente simples, veja o exemplo:

package tutorial;

class MinhaClasse {

}

Tipos de Dados em Scala

Os tipos de dados de Scala, são exatamente os mesmos de Java, bem como suas precisões:

• Integer: 1, 882, -1
• Boolean: true, false
• Double: 1.0, 1d, 1e3
• Long: 42L
• Float: 78.9f
• Characters: ’4′, ‘?’, ‘z’
• Strings: “Hello World” (String)

Além de algumas adições interessantes, por exemplo:

a) Multilinha: ( “”") : Tripla Aspas

""" Esta
Linha está
quebrada """

Além de:

b) XML incluído no código (Alerta: Se você achar isso feio, ok, não faz mal , apenas é para lhe informar)

<strong>Clientes com Débito</strong>
<ul>{(clientes).map(i =>
	<li>{i.nome}</li>
)}</ul>

Atributos de uma Classe, Variáveis etc

Agora que sabemos os tipos de dados, vamos adicionar algumas informações as classes. Em Scala, uma variável pode ser definida com uma das 3 seguintes palavras reservadas na frente:

* var
* val
* lazy

Veja os exemplos:

var y: String = "Curintians"
val x: String = "Palmeiras"
lazy val lz: String = timesQueOCurintiansPerdeu();

Vamos a cada uma das situações (Mil perdões ao Corintianos, o intuito aqui é ser didático):

y   -  É um atributo variável Simples com o valor Palmeiras
x  -  É um atributo que uma vez carregado não pode ser alterado(imutável), como declarar uma variável como final em Java.
lz -  É uma “variável”  que o valor dela pode ser um método que pode demandar um tempo de processamento para ser calculado e atribuído, por isso lazy é usando mais ou menos como o LazyLoad do Hibernate num relacionamento, ou seja, a lista só vai ser retornada se pedida. No caso de lz, o método retorna uma longuissima lista de times, e não queremos que essa variável receba esse valor até que o mesmo seja realmente utilizado no programa.

Uma váriável(var y) ou constante(val x) podem ser dinamicamente tipadas, logo, a declaração poderia ser:

var x = "Curintians"

Automaticamente, a varíavel x será tipada como String.

Métodos

Ah, essa é uma das partes deste primeiro tutorial que você mais vai gostar,  pelo menos foi uma das coisas mais limpas que vi em Scala.  Para criar métodos, você precisa da palavra reservada: def.  É importante, não confundir def com Functions, que vamos ver posteriormente, uma vez que a idéia dos métodos é identica ao Java, só que ao invés de void ou o retorno, usamos uma outra semantica:

a) Método que não retorna valor: def adicionarItemACesta() = { … }
b) Método que retorna valor: def listarCestaDeCompras() : List[T] = { … }

Exercício de Fixação

Um dos métodos de aprendizado é associação, então apenas mentalmente refaça estes 2 métodos em Java ou C#

Object

Em vários casos precisamos ou usamos usar o Pattern GOF Singleton(Um e somente um), em Scala, se você precisar criar um Singleton, você pode definir um object . A semantica é similar a de uma Classe e veremos em nosso primeiro exercício como utilizar isto:

Exercício

No Eclipse, vá em: File/New … Na Janela digite Scala Project, uma vez o plugin instalado, ele irá achar este item, selecione-o e crie um projeto com o nome: tutorial, clique em next e os passos seguintes são similares a quando você cria um projeto Java.

No Package Explorer do Eclipse no item src(Source), clique com o botão contrário do mouse e escolha: New Package, crie este pacote com o nome: capitulo1 .

Agora crie seu primeiro arquivo .scala: botão direito no pacote capitulo 1: New Scala Class, dê o nome de Application

Dentro do arquivo Application.scala , escreva o seguinte código:

package capitulo1;

object Application {

def main(args: Array[String]) {

Console.println("#############################");
Console.println("         Scala Tutorial     ");
Console.println("#############################");

}
}

Agora vá até o menu Run \ Run Configurations… , Lá você econtrará um item chamado um item a esquerda chamado de Scala Application, você vai clicar no botão “New Launch Configuration” e vai configurar como na imagem abaixo:

Configuração de Execução das Aplicações Scala

E agora você clicará no botão executar como na imagem abaixo:

Pronto [que nem a gravação do callcenter na NET] , você executou seu primeiro programa Scala. Claro que este não é digno de tanto orgulho por hora, mas vamos aproveitar e ver o que aprendemos neste primeiro post de capitulo1.

Vamos rever os conceitos de orientação a objetos com a seguinte hierarquia:

Veiculo
Caminhao
Esportivo

Vamos as definições:

Veiculo.scala:

package capitulo1;

class Veiculo {

val marca : String  = ""  ;
val modelo :String = ""  ;
val motor : String = "Motor Geral"  ;

override def toString() : String = {
     marca + ",  " + modelo +  ", "+ motor;
}
}

Esportivo.scala:

package capitulo1;

class Esportivo extends Veiculo {

override val marca : String = "GM";
override val modelo : String = "Camaro";
override val motor : String = "Esportivo - Gasolina - 2.2";

}

Caminhao.scala :

package capitulo1;

class Caminhao extends Veiculo {

override val marca : String = "MERCEDEZ-BENZ";
override val modelo : String = "1311";
override val motor : String = "DIESEL 6.2";

}

Agora vamos bricar com polimorfismo na nossa alterada classe Application.scala:

package capitulo1;

object Application {

val veiculo1 : Veiculo = {
new Esportivo
}

val veiculo2 : Veiculo = {
new Caminhao
}

def main(args: Array[String]) {

Console.println("#############################");
Console.println("         Scala Tutorial     ");
Console.println("#############################");

println(veiculo1);
println(veiculo2);
}
}

Veja que definimos 2 atributos: veiculo 1 e veiculo 2 , ambos são do mesmo tipo, porém eu os construo respectivamente com cada um dos herdeiros (Esportivo e Caminhao).   Para ficar ainda mais claro vamos fazer uma comparação:

val veiculo1 : Veiculo = {
new Esportivo
}

é exatamente como:

Veiculo veiculo1 = new Esportivo();

Para deixar ilustrar nosso exemplo ainda melhor,  vamos imaginar que além to método toString() que nós sobrescrevemos (override), nos também criassemos um método toXML(), veja como isto fica alterando o arquivo Veiculo.scala:

package capitulo1;

class Veiculo {
...

 def toXML(): String = {

 <veiculo>
 <marca>{marca}</marca>
 <modelo> {modelo}</modelo>
 <motor>{motor}</motor>
 </veiculo>.toString;
 }
}

Veja o output :

#############################
 Scala Tutorial
#############################
<veiculo>
 <marca>GM</marca>
 <modelo> Camaro</modelo>
 <motor>Esportivo - Gasolina - 2.2</motor>
 </veiculo>
<veiculo>
 <marca>MERCEDEZ-BENZ</marca>
 <modelo> 1311</modelo>
 <motor>DIESEL 6.2</motor>
 </veiculo>

Interessante não é?

Por último, o que você acha de Scala, brincando com Swing? Então, crie um outro arquivo chamado HelloSwing.scala :

package capitulo1;

import javax.swing._

object HelloSwing extends JFrame( "Scala :::: Frame")
{
def main( args: Array[String] ) =
{
showFrame();
}

def showFrame() = {

setSize(400, 300)
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE )
add( new JLabel( "Bem Vindo ao mundo Scala" ) )
pack()
setSize(400, 300);
setVisible( true )

}

}

Conclusão

Amigo , se você chegou até aqui, é que você realmente tem algum interesse em Scala, eu acredito muito nessa linguagem, não quero dizer que ela é uma sucessora da linguagem Java, e sim, que para alguns propósitos (Threads, Concorrência, HPC , Cloud ) Scala pode ser muito interessante.

Outra coisa, estes tutoriais servem para tirar o mito que Scala é tão complexo, e visa justamente trazer exemplos simples, tangíveis e acima de tudo legíveis,  sei que no mercado existem um monte de “Scaleiros” extremamente mais conhecedores que eu, se você quiser ajudar adicionando dicas, comentários criativos e construtivos, por favor és mais que bem vindo :)

Cenas dos Próximos Capítulos

No próximo capítulo veremos:

- Construtores
- Traits
- Functions

Ainda nesta série:

- Collections
- Web
- XML
- Concorrência e Paralalelismo
- Actors

Até a próxima!

Posted in book | Tagged | 5 Comments

Bem Vindo ao Alta Scala

O Alta Scala é um “BlogBook”, a idéia dele é publicar aqui uma espécie de cada post uma um capítulo ou trecho de um Livro, longe de um dia ter a pretensão de publicar algo, mas vai saber :)

Este blog está fora pro edgarsilva.com.br , para desvincular do meu blog , bem como este poder contar com outros autores, e não somente eu.

Espero que as pessoas gostem, e quem quiser contribuir , basta me contactar @jedgarsilva

Quem quiser acompanhar os códigos que vamos criaando nos tutoriais, não precam meu repositório do github (https://github.com/edgars/altascala):

object Gui extends scala.gui.Application {

  val mainWindow = new container.Window {

    val press = new widget.Button {
      text = "Press me, please"
      subscribe(this)
      toplevel eventloop {
        case this.Click() =>
          field.text = "Wow! Someone pressed me."
      }
    }
Posted in Uncategorized | Leave a comment