Dúvida na sintaxe Ruby

2 respostas
PaduaAlves

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

# 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
# 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

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

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

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

2 Respostas

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. =)

Ataxexe

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. =)

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).

Criado 22 de maio de 2014
Ultima resposta 30 de out. de 2014
Respostas 2
Participantes 3