Em relação a blocos e iteradores do Ruby é INCORRETO afirma...
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
A alternativa correta é a D - o bloco pode introduzir novas variáveis no contexto onde foi criado.
Vamos detalhar cada um dos itens para entendermos o assunto:
-
A - Blocos em Ruby são realmente delimitados por
{ ... }
oudo ... end
, sendo uma convenção usar as chaves para blocos de uma única linha edo ... end
para blocos de várias linhas. -
B - Iteradores são uma maneira poderosa em Ruby para percorrer coleções. Métodos como
each
,map
,select
são exemplos de iteradores que podem muitas vezes substituir laços tradicionais comofor
ouwhile
. -
C - Em Ruby, é possível passar um bloco para praticamente qualquer método. O método pode então invocar o bloco usando a palavra-chave
yield
. -
E - Blocos podem de fato receber parâmetros que são especificados entre pipes (
|param1, param2|
). Esses parâmetros podem ser usados dentro do bloco.
Por fim, a alternativa D afirma que um bloco pode introduzir novas variáveis no contexto onde foi criado, o que é incorreto. Na verdade, um bloco cria um novo escopo para variáveis; variáveis definidas dentro de um bloco não são acessíveis fora dele. No entanto, um bloco pode acessar variáveis que já existem no contexto onde o bloco foi definido. Portanto, a afirmativa D está incorreta porque um bloco não modifica o contexto existente, mas sim cria um novo escopo para suas próprias variáveis.
Espero que essas explicações ajudem a esclarecer como blocos e iteradores funcionam em Ruby e por que a alternativa D foi a resposta correta para essa questão.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Não sou especialista mas o link abaixo explica muito. Imagino que no item D Carlos Chagas quis dizer com "onde" o bloco pai e não ele mesmo.
http://rubylearning.com/satishtalim/ruby_blocks.html
A) Ruby Code blocks (called closures in other languages) are definitely one of the coolest features of Ruby and are chunks of code between braces or between do..end that you can associate with method invocations, almost as if they were parameters.
B) Acredito que seja assim em toda linguagem, porque seria diferente em Ruby? (
Ps, tecnicamente imagino que TODO iterador (não em muitos casos) possa ser substituído por um laço equivalente, mas melhor não brigar com a banca, até porque em muitos casos é um subconjunto de todos.
C) Acredito que seja igual JS.
D) In the above block, a new feature is being used: block local variable. In short, block local variables shield a block from manipulating variables outside of its scope. This prevents a block from unintentionally clobbering any variables outside its scope. If you don't want to clobber variables, use block local variables for the variables your block creates.
E) You can provide parameters to the call to yield: these will be passed to the block. Within the block, you list the names of the arguments to receive the parameters between vertical bars (|).
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo