types iterator julia-lang

types - Asignación de tipo personalizado Julia



iterator julia-lang (2)

La asignación utiliza el protocolo de iterador y, por lo tanto, el start , el done y el next deben implementarse para el tipo.

Un comentario sobre el estilo, los nombres de tipos debe comenzar con una letra mayúscula y los campos preferiblemente deben ser tipos concretos para el rendimiento. A continuación, he introducido un parámetro de tipo T en Foo . T puede ser de cualquier tipo, pero los campos de Foo tienen el mismo tipo. Si se trata de parámetros de tipo adicionales restrictivos, se puede introducir o se puede asignar a cada campo un tipo concreto.

El siguiente ejemplo implementa start , done y next para el tipo Foo

type Foo{T} x::T y::T z::T end Base.start(foo::Foo) = 1 Base.done(foo::Foo, i) = nfields(foo) < i Base.next(foo::Foo, i) = getfield(foo, i), i+1

Con lo anterior implementado, el contenido de Foo se puede dividir en diferentes variables:

x, y, z = Foo(1, 2, 3)

Como beneficio adicional, Foo ahora se puede repetir en un ciclo completo como:

for i in Foo(1, 2, 3) println(i) end

Intento asignar múltiples elementos de un tipo personalizado en julia. Sin embargo, no sé cómo hacerlo. O en otras palabras, me gustaría sobrecargar al operador de asignación para que devuelva una tupla de todos los elementos contenidos en el tipo.

Aquí está el comportamiento deseado:

type foo a b end (a,b) = foo(1,2) a > 1

y aquí está el mensaje de error:

ERROR: LoadError: MethodError: `start` has no method matching start(::foo)

Mi opinión es que necesito implementar algún tipo de iterador que se encargue de la tarea, pero no sé cómo hacerlo.

EDITAR

Implementé las funciones "inicio (), hecho (), siguiente ()". Ahora estaba preocupado acerca de cómo todavía podría asignar el tipo y no sus elementos.

Escritura:

a, b = foo(1,2) a # returns > 1

sin embargo:

a = foo(1,2) a # returns > foo(1,2)

que es fantástico Por lo tanto, julia reconoce que tener un único elemento en el lado izquierdo (lhs) de la ecuación devolverá el tipo en el lado derecho y que tener ''n'' elementos en el lhs asignará elementos ''n'' del tipo. Por lo tanto, si desea asignar todo el tipo, debe asignar el tipo a un solo elemento en lhs. Eso es.


No sé cómo sobrecargar el operador de asignación, pero puede devolver todos los campos con esta función:

all_fields(x) = [x.(i) for i = 1:nfields(x)]

Entonces puedes hacer

(a,b) = all_fields(foo(1,2))