Ik ben bezig met een opdracht in Ruby. Hiervoor heb ik een aantal functies gemaakt die twee array's met elkaar vergelijkt en er een mapping van maakt (wordt gebruikt om termen te vervangen indien een formule wordt ingegeven). Nu wil het probleem dat de lijst met regels (param x) waar aan voldaan moet worden en de lijst die gematcht moet worden (param s_exp), recursief worden gestript en daardoor niet kunnen worden hergebruikt. De enige manier die ik ook kan vinden is namelijk door het gebruik van shift, maar doordat het by reference werkt blijft er op de originele arrays niets meer staan.
Ik dacht zelf handig te zijn en Marshal.load te combineren met Marshal.dump en zodoende een echte kopie te maken van de arrays voordat ermee wordt gewerkt, maar hierdoor kom ik in een endless recursion en faalt de uitvoer. Ik ben zelf absoluut niet gewend aan deze manier van programmeren en ben er al een paar weken naar aan het staren en kom er totaal niet meer uit.
Ik ben opzoek naar een aanwijzing om ervoor te zorgen dat de initiële array weer kan worden hersteld of mogelijk een alternatief voor shift, zodat het wel recursief gebruikt kan blijven worden maar weer wordt hersteld zodra het klaar is.
Ik dacht zelf handig te zijn en Marshal.load te combineren met Marshal.dump en zodoende een echte kopie te maken van de arrays voordat ermee wordt gewerkt, maar hierdoor kom ik in een endless recursion en faalt de uitvoer. Ik ben zelf absoluut niet gewend aan deze manier van programmeren en ben er al een paar weken naar aan het staren en kom er totaal niet meer uit.
Ik ben opzoek naar een aanwijzing om ervoor te zorgen dat de initiële array weer kan worden hersteld of mogelijk een alternatief voor shift, zodat het wel recursief gebruikt kan blijven worden maar weer wordt hersteld zodra het klaar is.
Ruby:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
| def match(x, s_exp) match_rec(x, s_exp, {}) end # # Auxiliary methods for match # def match_rec(x, s_exp, m) if x.kind_of?(Array) && s_exp.kind_of?(Array) then return match_array(x, s_exp, m) elsif variable?(x) then return match_var(x, s_exp, m) elsif x == s_exp then return m else return nil end end def match_var(x, s_exp, m) if (m.has_key? x) then m = match_rec(m[x], s_exp, m) else m[x] = s_exp end return m end def match_array(x, s_exp, m) if x.kind_of?(Array) && !x.empty? && s_exp.kind_of?(Array) && !s_exp.empty? then m_rec = match_rec(x.shift, s_exp.shift, m) if !m_rec.nil? then match_array(x, s_exp, m_rec) end end if x.empty? && s_exp.empty? then return m end return nil end |
telefoontoestel