Jump to content

Empfohlene Beiträge

Geschrieben (bearbeitet)

Greetings,

Um eine Funktion für mehrere Ereignisse benutzen zu können, habe ich versucht, sie in einer Tabelle unterzubringen, die dann zu einer Ereignis-Variablen gemacht wird.
Das gelingt aber nicht, siehe Demo-Code mit Kommentaren.
Geht das wirklich nicht, oder übersehe ich da was?

Danke für alle Tips.

Cheers,
El Ferrocarrilero

--[[
  Funktionen als Tabellen-Elemente *in einer Ereignis-Variablen* ?
  (als auslösendes Ereignis dient Betätigung eines Schalters)
--]]

tb = {
  eins = 111,
  zwei = 222,
  doSomething = function(etwas)
                  print("Funktion tb.doSomething: " .. tostring(etwas))
                end,
  drei = 333
}
n = 0            
for _ in pairs(tb) do
  n = n + 1
end
    -- (Anscheinend die einzige Art, die Länge einer Tabelle mit nicht-numerischen Indices
    -- zu bestimmen; #tb funktioniert _nicht_ (learned it the hard way...:-/ )

print(">>>> Einträge in lokaler Tabelle tb: " .. tostring(n)) 
    --> 4 OK
print(tb.doSomething("Hallo!"))
    --> Funktion tb.doSomething: Hallo!  OK
    --  mit einer Tabelle direkt im Skript geht es also. So weit, so gut.

    -- nun die Tabelle mit enthaltener Funktion zu Ereignis-Variabler machen:
    -- (geht wohl nicht in der grafischen EV. I think.
    --  Dort z.B. als "Text (mehrzeilig)" eingegebene Funktion funktioniert (logischerweise) nicht.)

$("Ereignisse").variables.tbNEU = tb
    --> Module-Var. wird gesetzt --> Ereignisse, "tbNEU", {3 Elemente}
    -- sollten 4 Elemente sein, aber Inspektion in der EV zeigt, dass die Funktion fehlt 

n2 = 0
for _ in pairs($("Ereignisse").variables.tbNEU) do
  n2 = n2 + 1
end
print(">>>>> Einträge in Ereignis-Variable (Tabelle) tbNEU: " .. n2)   
    --> 3 korrekt, weil die Funktion fehlt

z = $("Ereignisse").variables.tbNEU.drei
print("tbNEU.drei: " .. z) 
    --> tbNEU.drei: 333   OK, "normale" Einträge tuns also...

-- ... die Funktion aber nicht:
out = $("Ereignisse").variables.tbNEU.doSomething("Huhu!")
    --> Skriptfehler: attempt to call a nil value (field 'doSomething')
    --  (traurig aber logisch, da Funktion gar nicht in die Ereignis-Var. übernommen wurde)
print(out)  -- Sorry, Dave, I can't do that...

 

 

 

 

 

 

Bearbeitet von ElFerrocarrilero
Geschrieben
vor 1 Stunde schrieb ElFerrocarrilero:

Geht das wirklich nicht

Hallo El Ferrocarrilero!

Es geht nicht auf diesem Weg, weil du mit den Modul- und Objektvariablen die Lua-Umgebung verlässt.
Diese Variablen werden in den Objekten des Studios verwaltet und können deshalb keine Lua Funktion enthalten.

Aber die benutzerdefinierten Ereignisse verhalten sich wie Funktionen.
Sie können Parameter haben und Werte zurückgeben.

Und ein benutzerdefiniertes Ereignis kannst du in eine Modultabelle legen. damit hast du genau das, was dir vorschwebt.

Viele Grüße
Götz

Geschrieben (bearbeitet)

Hallo Götz,

aha! Wieder was gelernt; den "benutzerdefinierten Ereignissen" war ich bisher eher aus dem Wege gegangen, werde sie mir aber nun mit Interesse genauer ansehen.

33 minutes ago, Goetz said:

weil du mit den Modul- und Objektvariablen die Lua-Umgebung verlässt

Das ist (vor allem am Anfang) immer etwas das Problem: man weiß oft nicht so recht, soll man bei der "allgemeinen" Lua-Sprache weitersuchen* oder geht es um etwas MBS-Spezifisches.

Vielen Dank für die schnelle und hilfreiche Antwort!

Cheers,
El Ferrocarrillero

* wo ich z.B. nun lernen konnte/musste/durfte , dass der # Operator mit nicht-numerisch indiziertenTabellen nicht funktioniert... :$

 

 

 

 

 

Bearbeitet von ElFerrocarrilero
korrekter Dativ statt Bergischer Akkusativ :-)
Geschrieben
vor 14 Minuten schrieb ElFerrocarrilero:

Das ist (vor allem am Anfang) immer etwas das Problem

Dafür hast du die Community hier, die in solchen Fällen gerne eigene Erfahrungen beisteuert und über Hürden hinweg hilft.

Geschrieben
vor 16 Minuten schrieb ElFerrocarrilero:

bei der "allgemeinen" Lua-Sprache [...]  wo [...] der # Operator mit nicht-numerisch indiziertenTabellen nicht funktioniert...

Ja, das ist bei Lua fies: Sie schmeißen Listen und Tabellen in einen Topf, aber trotzdem unterscheiden sich die beiden.
Und um allem die Krone aufzusetzen, können Tabellen auch noch in Teilen eine Liste sein. Dieser Abschnitt verhält sich dann auch wie eine Liste.

Geschrieben (bearbeitet)
31 minutes ago, Goetz said:

Ja, das ist bei Lua fies: Sie schmeißen Listen und Tabellen in einen Topf, aber trotzdem unterscheiden sich die beiden

Genau. Als Sprache einfach aussehen und einfach sein ist nicht dasselbe... ("Simple: Everything is a table! Except where it isn't.") :P

Bearbeitet von ElFerrocarrilero

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...