Dúvida na sintaxe Ruby

Olá a todos. Sou iniciante em Ruby. Comecei a poucos dias. Estou estudando pelo livro da casa do código. Em determinado momento, tenho essas duas classes

[code]# encoding: utf-8
class Livro
attr_accessor :valor
attr_reader :categoria
def initialize(autor, isbn = “1”, numero_de_paginas, valor, categoria)
@autor = autor
@isbn = isbn
@numero_de_paginas = numero_de_paginas
@valor = valor
@categoria = categoria
end

def to_s
"Autor: #{@autor}, Isbn: #{@isbn}, Número de Páginas: #{@numero_de_paginas}, Preço: #{@valor}, Categoria: #{@categoria}"
end

end[/code]

[code]# encoding: utf-8
class Biblioteca

attr_reader :livros
def initialize
@livros = {}
end

def adiciona(livro)
@livros[livro.categoria] ||= []
@livros[livro.categoria] << livro
end

def livros
@livros.values.flatten
end

end[/code]

minha dúvida consiste na seguinte linha de código

Não entendi o esse sinal de || antes da atribuição. Alguém pode me esclarecer?

Olá,

Não sei se você já teve a dúvida solucionada, mas caso não a tenha o operado “||=” é igual ao operador unless ou seja no código

 @livros[livro.categoria] ||= []  

A menos que livro.categoria seja nill o array livros não será criado.

Ficando assim:

if  livro.categoria.nil?
    @livros = []
end

Não sei se ficou muito claro… qualquer coisa posta ai. =)

[quote=cido18]Olá,

Não sei se você já teve a dúvida solucionada, mas caso não a tenha o operado “||=” é igual ao operador unless ou seja no código

 @livros[livro.categoria] ||= []  

A menos que livro.categoria seja nill o array livros não será criado.

Ficando assim:

if  livro.categoria.nil?
    @livros = []
end

Não sei se ficou muito claro… qualquer coisa posta ai. =)[/quote]

Está mais ou menos certo. Na verdade ele checa se @livros[livro.categoria] é nulo e, caso afirmativo, aloca um array vazio nele.

Algo assim:

if  @livros[livro.categoria].nil?
    @livros[livro.categoria] = []
end

Até porque a variável @livros é um Hash e não um Array e não faria muito sentido mudar seu tipo (nem é uma boa prática, inclusive).