Trackback von deiner Website.

Kommentare (3)

  • Avatar

    Ed

    |

    Tag!

    Ich weiß nicht, wie Symbols in Scala funktionieren, aber in Scheme werden sie wie Strings benutzt mit der Eigenschaft, dass sie nur einmal erstellt werden.
    z.B. (wenn ich Scheme mit Java-Syntax schreiben wuerde):
    Symbol foo1 = new Symbol(»foo«);
    Symbol foo2 = new Symbol(»foo«);
    foo1==foo2; // true -> sie sind Zeiger zum selben Speicherplatz.

    Demzufolge werden sie in Scheme wie enums benutzt, mit dem Vorteil, dass sie auch eine String-Darstellung haben.

    Ich habe jetzt geschaut. In Scala funktioneren sie genauso.

    Reply

    • Avatar

      Sven

      |

      Du hast Recht, in Scala ist das genauso.

      Wenn ich mich recht entsinne ging es in der Episode um Symbols in JavaScript. Die haben eine andere Bedeutung. Dort sind zwei Symbols vom gleichen Wert explizit nicht gleich. Laut MDN ist der primäre Zweck der anonyme Object-Properties zu erstellen.

      In the JavaScript run-time environment, a symbol value is created by invoking the function Symbol(), which dynamically produces an anonymous, unique value. The only sensible usage is to store the symbol and then use the stored value to create an object property. The following example stores the symbol in a »var«.

      var  myPrivateMethod  = Symbol();
      this[myPrivateMethod] = function() {...};
      

      Reply

      • Avatar

        Ed

        |

        ah, Ok, sorry. Das habe ich mir falsch aufgeschnappt.

        Ein weiterer Grund für diese komplizierte Definition von Symbols in JS könnte mit dem JIT-Compiler zu tun haben. Ich schätze, dass myObject[mySymbol] sich schneller finden lässt als myObject[myString] (oder noch gräßlicher: myObject[»my«+»String«]), womöglich ähnlich schnell wie myObject.myProperty.

        Übrigens versteckt mitten in der Spec ist ein zweiter Symbol-Konstruktor:

        assert.equal(Symbol.for(›foo‹), Symbol.for(›foo‹));

        was nur für Verwirrung sorgen kann.

        Reply

Kommentieren