Referências circulares no Ruby 2.2.x
Publicado em Developer
circular methods ruby
Eu estava para escrever esse artigo faz algum tempo, desde que saiu a versão 2.2.0 da linguagem Ruby, mas nunca dava tempo, até que, rodando um projeto nesse versão, me lembrei de um detalhe importante, já consertado em gems mais novas, mas que vale a pena alertar.
Vamos considerar o seguinte código:
Podemos ver que temos dois métodos ali: foo
, que retorna uma String
, e bar
, que utiliza um argumento com valor default, que no caso de não ter sido enviado, vai utilizar o retorno de foo
. Rodando o código em uma versão menor que 2.2.x, é exibido o seguinte resultado:
$ ruby circular.rb
I'm in foo!
Not using foo!
Mas, rodando a partir da versão 2.2.0
, temos o seguinte resultado:
$ ruby circular.rb
circular.rb:6: warning: circular argument reference - foo
Not using foo!
O que ocorre é que, a partir da versão 2.2.0
, o argumento foo
(à esquerda) está procurando uma variável foo
(à direita), e como ela não existe e seria ali uma referência para a própria váriavel que está sendo criada na assinatura do método (daí a referência circular), é atribuído o valor de nil
e disparado um warning.
Para utilizar o comportamento anterior nas versões a partir de 2.2.x
, temos que fazer uma referência explícita ao método foo
na linha 6, da seguinte maneira:
def bar(foo = foo())
Algumas gems do Rails, dependendo da versão, estavam com esse tipo de problema (como por exemplo, o ActiveSupport), mas aparentemente em versões atuais, já foi resolvido. Na hora que forem rodar seus projetos com versões novas do Ruby a partir das 2.2.x
, fiquem espertos com isso.
Comentários
Comentários fechados.
Sem nenhum comentário.
Artigos anteriores
- Pull requests em modo raiz - sex, 22 de dezembro de 2023, 09:57:09 -0300
- Qual a idade do seu repositório? - ter, 27 de dezembro de 2022, 12:50:35 -0300
- Utilizando ctags em projetos Rails mais recentes - qui, 24 de junho de 2021, 08:23:43 -0300
- Fazendo o seu projeto brotar - seg, 15 de julho de 2019, 08:57:05 -0300
- Learn Functional Programming with Elixir - sex, 02 de março de 2018, 18:47:13 -0300
- Ambiente mínimo - Driver Driven Development - qua, 23 de agosto de 2017, 15:15:03 -0300
- Ambiente mínimo - repositórios de código - dom, 16 de abril de 2017, 13:02:14 -0300
- Ambiente mínimo - terminal e navegador - dom, 02 de abril de 2017, 21:43:29 -0300
- Utilizando muitas gems no seu projeto? - sáb, 29 de outubro de 2016, 11:57:55 -0200
- Desenvolvedores e inteligência artificial - seg, 11 de julho de 2016, 09:09:38 -0300