[OFF] Escopo de variável em Ruby  XML
Índice dos Fóruns » Ruby & Ruby on Rails
Autor Mensagem
nadele
Debugger

Membro desde: 14/02/2008 13:28:16
Mensagens: 62
Offline


Em Java quando eu entro num bloco (dentro de um loop por exemplo) é fácil saber se posso usar a variável x.



Já em Ruby ou em uma linguagem sem tipos:



Como vocês fazem para controlar o escopo numa linguagem sem tipos?

PS: Dá para exibir código Ruby no JForum ou ele só formata para Java?
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Pode sim, as variáveis declaradas no mesmo escopo aonde a closure foi declarada ficam disponíveis pra closure também.

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
cv
Moderador
[Avatar]

Membro desde: 04/04/2003 00:32:12
Mensagens: 7842
Localização: São Paulo, SP
Offline

Escopo nao tem nada a ver com tipagem. E, a proposito, Ruby tem tipos; a diferenca eh que vc nao precisa declara-los que nem bobo
[Email] [WWW] [Yahoo!] [MSN] [ICQ]
nadele
Debugger

Membro desde: 14/02/2008 13:28:16
Mensagens: 62
Offline


O que eu quiz dizer foi o seguinte: Quando eu chego no meu escopo, eu não vou me lembrar se eu já declarei x antes.

Então eu quero declarar um x ali só para o meu escopo. Daí sem querer eu posso introduzir um bug chato de descobrir depois.

Se tivesse algo assim:



Acho que resolvia o problema, ou seja, um var x não poderia ser chamado duas vezes para declarar uma variável dentro do mesmo escopo.
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Em Ruby isso não tem jeito, você é que vai ter que ficar cuidando disso, mas convenhamos, você consegue imaginar algum caso onde isso vai acontecer?

Não existe o for de Java em Ruby

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
nadele
Debugger

Membro desde: 14/02/2008 13:28:16
Mensagens: 62
Offline

Maurício Linhares wrote:Em Ruby isso não tem jeito, você é que vai ter que ficar cuidando disso, mas convenhamos, você consegue imaginar algum caso onde isso vai acontecer?


Isso me parece que vai acontecer toda hora, ou seja, quando você entrar num escopo novo, seja um IF ou um LOOP, e você quer declarar uma variável para usar apenas ali dentro (e não fora), você vai ter que tomar cuidado para não usar uma variável já declarada, sem querer.

Concorda?
jack_-_ganzha
JavaEvangelist
[Avatar]

Membro desde: 31/03/2003 13:18:12
Mensagens: 315
Localização: Recife - Pernambuco
Offline

Se vc está se preocupando com escopo a esse ponto, deve ter algo de errado. Em geral, vc só usa uma variavel declarada 50 linhas antes se ela estiver no escopo da classe. No mais, o interessante é tentar manter métodos e blocos de código mais curtos: são mais fáceis de ler, entender e manter.

valeuz...

Marcos Silva Pereira

http://www.javafree.org
http://marcospereira.wordpress.com
[MSN] [ICQ]
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

nadele wrote:Isso me parece que vai acontecer toda hora, ou seja, quando você entrar num escopo novo, seja um IF ou um LOOP, e você quer declarar uma variável para usar apenas ali dentro (e não fora), você vai ter que tomar cuidado para não usar uma variável já declarada, sem querer.


Acho que você ainda não pegou o jeito da linguagem

O for do Java em Ruby seria algo assim:



O x só foi declarado dentro da própria closure, como seria um x de um for em Java, não vai matar ninguém. Agora se o que você está se preocupando mesmo é o nome de variáveis talvez seja um problema dos nomes que você está dando. Nomes mais "explicativos" normalmente não tem esse problema.

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
nadele
Debugger

Membro desde: 14/02/2008 13:28:16
Mensagens: 62
Offline

Mas no meu caso o x não era do closure não... O x é algo que eu quero declarar DENTRO do closure. Se eu já declarei fora e me esqueci (ou estou no meio de um refactoring de um código que não foi nem que que fiz) estarei introduzindo um bug chato de pegar depois.

Isso que o jack falou faz sentido, mas num caso de um refactoring não ajuda não. Seria legal ter um var para declarar uma nova variável sem tipo.

Do jeito que é isso, se eu for criar uma variável x dentro de um block, eu tenho que procurar fora do código via CTRL+F mesmo se já existe um x. Isso me parece péssimo! Scala tem var! Talvez seja por causa dissol...

This message was edited 2 times. Last update was at 14/02/2008 21:12:37

Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

nadele wrote:Mas no meu caso o x não era do closure não... O x é algo que eu quero declarar DENTRO do closure. Se eu já declarei fora e me esqueci (ou estou no meio de um refactoring de um código que não foi nem que que fiz) estarei introduzindo um bug chato de pegar depois.


Ah companheiro, você não sabe da missa o terço

Um "control + f" não vai salvar a sua vida em Ruby, alguém pode ter adicionado o método lá na classe via metaprogramação com o mesmo nome da sua variável e você nunca iria saber até alguma coisa estourar

Lidar com linguagens que fazem mágica demais não é simples não

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
nadele
Debugger

Membro desde: 14/02/2008 13:28:16
Mensagens: 62
Offline


ahahaahahahaha, boa

Um simples 'var' (como Scala) resolveria isso...

Sem isso cada variável que eu declaro pode me assombrar depois...

Será que estou me preocupando a toa ou isso é realmente um problema.

Quando estou dentro de um escopo eu sempre penso assim:

"Vou declalar 'index' para usar aqui dentro. Mas será que eu já declarei isso antes?"

O compilador me avisaria se tivesse o diabo do 'var'. Sem ele não tem como saber se você está declarando pela primeira vez ou reutilizando alguma coisa que já foi declarada antes.

Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Esqueça o compilador, mesmo que ele existisse, em Ruby você ainda ia cair nesse problema de um método definido em tempo de execução.

Eu, até agora, não tive problema nenhum quanto a isso, o negócio é manter os métodos simples, pequenos e dar as variáveis nomes decentes (além de saber quais as mágicas estão acontencendo nos seus objetos).

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
jack_-_ganzha
JavaEvangelist
[Avatar]

Membro desde: 31/03/2003 13:18:12
Mensagens: 315
Localização: Recife - Pernambuco
Offline

Maurício Linhares wrote:Eu, até agora, não tive problema nenhum quanto a isso, o negócio é manter os métodos simples, pequenos e dar as variáveis nomes decentes (além de saber quais as mágicas estão acontencendo nos seus objetos).

Teste vão bem também.

valeuz...

Marcos Silva Pereira

http://www.javafree.org
http://marcospereira.wordpress.com
[MSN] [ICQ]
Thiagosc
GUJ Master

Membro desde: 27/04/2006 21:01:27
Mensagens: 1134
Offline

nadele wrote:
Sem isso cada variável que eu declaro pode me assombrar depois...

Será que estou me preocupando a toa ou isso é realmente um problema.


Isso pode ser um problema se você não tomar cuidado. Pelo menos em Lisp há uma convenção de nome adotada para variáveis globais, todas elas são declaradas assim: *nome-da-variavel*. Isso deixa o nome muito diferente das variáveis locais e não há perigo de você se confundir.
moises.trovo
Thread.start()

Membro desde: 20/11/2007 09:51:43
Mensagens: 46
Offline

Thiagosc wrote:
nadele wrote:
Sem isso cada variável que eu declaro pode me assombrar depois...

Será que estou me preocupando a toa ou isso é realmente um problema.


Isso pode ser um problema se você não tomar cuidado. Pelo menos em Lisp há uma convenção de nome adotada para variáveis globais, todas elas são declaradas assim: *nome-da-variavel*. Isso deixa o nome muito diferente das variáveis locais e não há perigo de você se confundir.


No ruby tb existem essas convenções, variáveis globais são @@nome, mas acho q uma convenção de projeto seria mais ideal.
E como os próprios alternativos de for do ruby disponibilizam a variável que incrementa acho bem difícil de acontecer isso seguindo uma arquitetura boa e deixando seu código bem limpo e dividido.
No mais, quando o desespero tiver batendo, o bug ainda estiver no programa e vc nem sabe onde ele está, vc pode fazer uma sessão de testes pra isolar o método ou classe q está bugando e dentro dela usar ObjectSpace.each_object para descobrir todos os objetos que estão em memória no momento.
 
Índice dos Fóruns » Ruby & Ruby on Rails
Ir para:   
Powered by JForum 2.1.8 © JForum Team