# Isso é um comentário=begin
Isso é um comentário multilinha
Ninguém os usa
Você não deve usar também
=end# Primeiro e principal: Tudo é um objeto.# Números são objetos3.class#=> Fixnum3.to_s#=> "3"# Um pouco de aritmética básica1+1#=> 28-1#=> 710*2#=> 2035/5#=> 7# Aritmética é apenas açúcar sintático# para chamar um método de um objeto1.+(3)#=> 410.*5#=> 50# Valores especiais são objetosnil# Nada para ver aquitrue# verdadeirofalse# falsonil.class#=> NilClasstrue.class#=> TrueClassfalse.class#=> FalseClass# Igualdade1==1#=> true2==1#=> false# Desigualdade1!=1#=> false2!=1#=> true!true#=> false!false#=> true# além de 'false', 'nil' é o único outro valor falso!nil#=> true!false#=> true!0#=> false# Mais comparações1<10#=> true1>10#=> false2<=2#=> true2>=2#=> true# Strings são objetos'Eu sou uma string'.class#=> String"Eu também sou uma string".class#=> Stringplaceholder="usar interpolação de string""Eu posso #{placeholder} quando estiver usando aspas duplas"#=> "Eu posso usar insterpolação de string quando estiver usando aspas duplas"# imprime para output (saída)puts"Estou imprimindo"# Variáveisx=25#=> 25x#=> 25# Note que uma atribuição retorna o valor atribuido# Isso significa que você pode fazer múltiplas atribuições:x=y=10#=> 10x#=> 10y#=> 10# Por convenção, use snake_case para nomes de variáveissnake_case=true# Use nomes de variáveis descritivoscaminho_para_a_raiz_do_projeto='/bom/nome/'caminho='/nome/ruim/'# Símbolos (são objetos)# Símbolos são imutáveis, são constantes reutilizáveis representados# internamente por um valor inteiro. Eles são frequentemente usados no# lugar de strings para transmitir com eficiência os valores específicos# e significativos:pendente.class#=> Symbolstatus=:pendentestatus==:pendente#=> truestatus=='pendente'#=> falsestatus==:aprovado#=> false# Arrays# Isso é um array[1,2,3,4,5]#=> [1, 2, 3, 4, 5]# Arrays podem conter diferentes tipos de itensarray=[1,"Oi",false]#=> => [1, "Oi", false]# Arrays podem ser indexados# a partir do começoarray[0]#=> 1array[12]#=> nil# Como aritmética, o acesso via [var]# é apenas açúcar sintático# para chamar o método [] de um objetoarray.[]0#=> 1array.[]12#=> nil# a partir do finalarray[-1]#=> 5# Com um índice de começo e fimarray[2,4]#=> [3, 4, 5]# Ou com um intervalo de valoresarray[1..3]#=> [2, 3, 4]# Adicionar a um array como estearray<<6#=> [1, 2, 3, 4, 5, 6]# Hashes são o principal dicionário de Ruby com pares de chaves(keys)/valor(value).# Hashes são simbolizados com chaves "{}"hash={'cor'=>'verde','numero'=>5}hash.keys#=> ['cor', 'numero']# Hashes podem ser rapidamente pesquisados pela chave (key)hash['cor']#=> 'verde'hash['numero']#=> 5# Procurar em um hash por uma chave que não existe retorna nil:hash['nada aqui']#=> nil# Interar sobre hashes com o método #each:hash.eachdo|k,v|puts"#{k} é #{v}"end# Desde o Ruby 1.9, temos uma sintaxe especial quando usamos símbolos como chaves (keys)novo_hash={defcon:3,acao:true}novo_hash.keys#=> [:defcon, :acao]# Dica: Tanto Arrays quanto Hashes são Enumerable.# Eles compartilham um monte de métodos úteis como each, map, count e mais# Estruturas de controleiftrue"Se verdadeiro"elsiffalse"else if, opcional"else"else, também é opcional"endforcontadorin1..5puts"interação #{contador}"end#=> contador 1#=> contador 2#=> contador 3#=> contador 4#=> contador 5# PORÉM# Ninguém usa para loops# Use "each" em vez, dessa forma:(1..5).eachdo|contador|puts"interação #{contador}"end#=> contador 1#=> contador 2#=> contador 3#=> contador 4#=> contador 5contador=1whilecontador<=5doputs"interação #{contador}"contador+=1end#=> contador 1#=> contador 2#=> contador 3#=> contador 4#=> contador 5grau='B'casegrauwhen'A'puts"Um longo caminho a percorrer, pequeno gafanhoto"when'B'puts"Melhor sorte da próxima vez"when'C'puts"Você pode fazer melhor"when'D'puts"Scraping through"when'F'puts"Você falhou"elseputs"Alternative grading system, eh?"end# Funçõesdefdobrar(x)x*2end# Funções (e todos os blocos) retornam implicitamente o valor da última linhadobrar(2)#=> 4# Parênteses são opicionais onde o resultado é clarodobrar3#=> 6dobrardobrar3#=> 12defsomar(x,y)x+yend# Argumentos de métodos são separados por uma vírgulasomar3,4#=> 7somar(3,4),5#=> 12# yield# Todos os métodos possuem implicitamente um paramêtro opcional que é um bloco# ele pode ser chamado com a palavra chave 'yield'defao_redorputs"{"yieldputs"}"endao_redor{puts'Olá mundo'}# {# Olá mundo# }# Define uma classe com a palavra chave 'class'classHumano# Uma variável de classe. Ela é compartilhada por todas as instâncias dessa classe@@especies="H. sapiens"# Inicialização básica (contructor)definitialize(nome,idade=0)# Atribui o argumento para a variável de instância "nome" do objeto@nome=nome# Se a idade não for passada, nós definimos um valor padrão na lista de argumentos@idade=idadeend# Método básico para atribuir valordefnome=(nome)@nome=nomeend# Método básico de resgatar valordefnome@nomeend# Um método de classe usa a palavra chave self para se diferenciar dos métodos de instância.# Ele só pode ser chamado na classe, não na instanciadefself.diz(msg)puts"#{msg}"enddefespecies@@especiesendend# Instanciando uma classejim=Humano.new("Jim Halpert")dwight=Humano.new("Dwight K. Schrute")# Vamos chamar um par de métodosjim.especies#=> "H. sapiens"jim.nome#=> "Jim Halpert"jim.nome="Jim Halpert II"#=> "Jim Halpert II"jim.nome#=> "Jim Halpert II"dwight.especies#=> "H. sapiens"dwight.nome#=> "Dwight K. Schrute"# Chamar o método de classeHumano.diz("Oi")#=> "Oi"# Uma classe também é objeto em Ruby. Então uma classe pode possuir variável de instância# Variáveis de classe são compartilhadas entre a classe e todos os seus descendentes.# Classe baseclassHumano@@foo=0defself.foo@@fooenddefself.foo=(value)@@foo=valueendend# classe filhaclassTrabalhador<HumanoendHumano.foo# 0Trabalhador.foo# 0Humano.foo=2# 2Trabalhador.foo# 2# Uma variável de instância não é compartilhada por suas classes descendentes.classHumano@bar=0defself.bar@barenddefself.bar=(value)@bar=valueendendclassDoutor<HumanoendHumano.bar# 0Doutor.bar# nil---moduleModuloDeExemplodeffoo'foo'endend# Incluir (include) módulos conecta seus métodos às instâncias da classe # Herdar (extend) módulos conecta seus métodos à classe em siclassPessoaincludeExemploDeModuloendclassLivroextendExemploDeModuloendPessoa.foo# => NoMethodError: undefined method `foo' for Pessoa:ClassPessoa.new.foo# => 'foo'Livro.foo# => 'foo'Livro.new.foo# => NoMethodError: undefined method `foo'# Callbacks são executados ao incluir e herdar um módulomoduleExemploDeConceitodefself.included(base)base.extend(MetodosDeClasse)base.send(:include,MetodosDeInstancia)endmoduleMetodosDeClassedefbar'bar'endendmoduleMetodosDeInstanciadefqux'qux'endendendclassAlgoincludeExemploDeConceitoendAlgo.bar# => 'bar'Algo.qux# => NoMethodError: undefined method `qux'Algo.new.bar# => NoMethodError: undefined method `bar'Algo.new.qux# => 'qux'