Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Dúvida sobre: linha_atual.each_with_index e .chars

Olá! Não entendi muito bem sobre o erro que dá por escrever "linha_atual.each_with_index"... Porque, nós temos aqui:

mapa.each_with_index do |linha_atual, linha|

... que é uma array de Strings, certo? (me corrijam se estiver errada).

E então temos:

linha_atual.each_with_index do |caractere_atual, coluna|

... Que deveria ser uma array de Strings também? Só que não é? E dai o código não funciona?

Qual a diferença entre "mapa" e "linha_atual", para colocarmos ".chars" em "linha_atual" e "mapa" não precisar?

Nem tudo que parece um pato é um pato... Então quem é o ser que não é um pato, nesse caso?

[ Trecho de "Laço Fundamental Básico": Existe um método de Array (que string também tem) que permite passar por cada (each) elementos dele. Cada elemento é nossa "linha_atual". Mas qual é o número da linha? Usamos o método "each_with_index" para nos dar a posição (index) de cada elemento, o que chamamos de linha.]

[ No site do ruby-doc.org está: chars → an_array

Returns an array of characters in str. This is a shorthand for str.each_char.to_a.

If a block is given, which is a deprecated form, works the same as each_char.

º Se meu inglês não estiver tão ruim... usando .chars retorna um array de caracteres em string. Então "Linha_Atual" é um array de caracteres? Ou é string que queremos transformar em Array de caracteres? ]

8 respostas

Opa, pelos nomes das variáveis, mapa é um objeto do tipo Hash => https://docs.ruby-lang.org/en/2.0.0/Hash.html, enquanto que a linha atual sim é do tipo String. Por isso a diferença entre os métodos.

Hum...

  • A Hash is a dictionary-like collection of unique keys and their values. Also called associative arrays, they are similar to Arrays, but where an Array uses integers as its index, a Hash allows you to use any object type.

  • Hashes enumerate their values in the order that the corresponding keys were inserted.

Mas o "mapa" não seria um dicionário/array associativo, seria?

Exemplo:

mapa1.rb
XXXX
X  X
XH X
X FX
XXXX

# H é o herói
# F é o fantasma


fogefoge.rb
def le_mapa (numero)
    arquivo = "mapa#{numero}.txt"
    texto = File.read arquivo
    mapa = texto.split("\n")
end

def joga (nome)
    mapa = le_mapa 1
...
end

O mapa então devolve um Array de Strings, certo?

Ou então, array de string é um tipo de hash/array associativo?

É, pelo código, mapa é um array de string mesmo.. não é um hash.

Só que a outra variável ainda é uma String, que é diferente de um array :).

Hum... desculpe, ainda não entendi direito...

Então, "each_with_index" funciona em "mapa" por ser um array de strings (definido em "le_mapa"). Por ser uma matriz e ter duas dimensões...

.... Enquanto que em "linha_atual" é apenas uma string, mesmo tendo elementos dentro dela?

solução!

Acho que entendi um pouco mais, só que preciso de uma confirmação.

Acho que estou errando ao pensar que "linha_atual" funciona da mesma maneira nos dois casos.

mapa.each_with_index do |linha_atual, linha|

x

linha_atual.each_with_index do |caractere_atual, coluna|

Em "mapa.each" nós :lemos: o mapa que é um "array de strings", com duas dimensões, linha e coluna. E nós lemos a "linha_atual" que está :dentro: desse array de strings, por isso dá para fazer "each_with_index".

Porém, em "linha_atual.each" nós não estamos mais lendo no "mapa". Explicando melhor, nós meio que isolamos e lemos o que está dentro dessa "linha_atual", que como é tratada com uma só dimensão, é uma String.

Como é uma String, não um array de strings, "each_with_index" não funciona.

É isso?

Mandou bem :)

Okay, obrigada Alberto =D Acho que não tinha entendido bem matriz e array de strings e deu nisso.