/ / Definiendo un Struct durante la inicialización - ruby

Definir una estructura durante la inicialización - ruby

Tengo una clase que lee un archivo CSV dinámico, y me gustaría crear una estructura basada en los encabezados del CSV.

Va así en pseudo-código:

class SomeClass
def initialize(csvfile)
@csv = CSV.open(csvfile, options.....)
.....
headers = @csv.headers  # => [:line, :error, :user, ........]   <==this is dynamic
RECORD = Struct.new(headers)
load_data
end

def load_data
@records = []
@csv.each do |r|
@records << RECORD.new(r.fields)
end
end
end

El problema es que una constante no puede (no debe) definirse dinámicamente. Entonces, ¿cuál debería ser la forma correcta de abordar esto?

Respuestas

2 para la respuesta № 1

No tienes que usar una constante. Usa una variable de instancia.

class SomeClass
def initialize(csvfile)
@csv = CSV.open(csvfile, options...)
...
headers = @csv.headers
@record = Struct.new(headers)
load_data
end
def load_data
@records = []
@csv.each do |r|
@records << @record.new(r.fields)
end
end
end

0 para la respuesta № 2

@sawa "s La respuesta es correcta. Añadiré algo más aquí.

Constantes se utilizan para almacenar valores que NO cambian. Si cambias una constante en tu programa es probablemente una error. Ruby está tratando de ser útil y dice "¡Espera! Creo que aquí está pasando algo extraño. Dijiste que querías que esto fuera una constante, pero ahora se está cambiando".

En Ruby, nunca se te permite poner una asignación constante, dentro de las definiciones de un método debido a la razón como acabo de decir. Si tratas de hacer asignación constante Dentro de un método, obtendrás Error de sintaxis. Según su necesidad, puede usar cualquier variable, pero no variables constantes, dentro de un método.

Si lo haces

Y = 1
#then
Y = 2
# warning: already initialized constant Y
# warning: previous definition of Y was here

Pero si lo intentas,

def meth arg
C = arg
end
# then
# SyntaxError: dynamic constant assignment
# C = arg
#   ^