Frage

Ich versuche, eine Möglichkeit zu finden, die Symbolgleichheit in der Ruby C-API zu testen.Betrachten Sie die folgende C-Funktion:

static VALUE test_symbol_equality(VALUE self, VALUE symbol) {
  if (rb_intern("test") == symbol) {
    return Qtrue;
  } else {
    return Qfalse;
  }
}

Aus Ruby-Sicht verhält sich diese Methode nicht wie erwartet:

test_symbol_equality(:test)    # => false

Warum ist das so?Wie muss ich den Code ändern, um das erwartete Verhalten zu erzielen?

War es hilfreich?

Lösung

Sie vergleichen in Ihrem Beispiel nicht dasselbe.

rb_intern gibt eine zurück ID, aber Sie vergleichen es mit dem VALUE direkt.Sie müssen das Gerät zunächst „auspacken“. VALUE, Abrufen der ID es ist damit verbunden.Ersetzen Sie Ihre if Die folgende Aussage sollte Ihr Problem lösen:

if (rb_intern("test") == SYM2ID(symbol)) {
    ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top