Verwalten Sie die API im Vergleich zur Verwendung von Idiomen in einem Port

12

Ich arbeite an einem Port von Python nach Rust und bin auf einen Code gestoßen, der in Rust nicht so natürlich ausgedrückt werden kann wie in Python.

In einem Fall werden Standardparameter verwendet:

class Foo:
  def __init__(self, a="Hello"):
    self._a = a

In Rust können Sie dies mit einem Builder implementieren:

struct FooBuilder {
  a: &'static str,
}

struct Foo {
  _a: &'static str
}

impl FooBuilder {
  fn new() -> FooBuilder {
    FooBuilder {
      a: "Hello",
    }
  }

  fn change_a(self, new_a: &'static str) -> FooBuilder {
    FooBuilder {
      a: new_a,
      ..self
    }
  }

  fn build(self) -> Foo {
    Foo {
      _a: self.a,
    }
  }
}

Um die Klasse in Python zu verwenden, ist es einfach:

foo = Foo("Hello, World!")

In Rust müssten Sie jedoch Folgendes schreiben:

let foo = FooBuilder::new().change_a("Hello, World!").build();

Dies führt zu der Frage: Ist es besser, eine API für einen Port zu verwalten, oder sind Redewendungen der Portierungssprache besser? Kommt es darauf an, wie bekannt die API ist?

auslöschen
quelle
2
Die API einer Klasse ist, wie Sie sie verwenden, nicht wie sie im Code ausgedrückt wird. Diese Übersetzung hat also eine völlig andere und einfach inakzeptabel umständliche ABI.
Deduplicator
Wo heißt es, dass das idiomatisch Rust ist?
Nadir Sampaoli
Es tut mir leid, ich muss falsch verstanden haben. Sie haben einen Teil des Rust-Codes gepostet, zusammen mit einem Dilemma: Wenn Sie eine API für einen Port pflegen oder Idiome der Portierungssprache verwenden möchten . Dieser Code sieht in keinem dieser Fälle aus. Wenn dies die richtige Interpretation ist, wozu dient dieses Codebeispiel? Was beschreibt es und in welcher Beziehung steht es zur eigentlichen Frage?
Nadir Sampaoli

Antworten:

18

Sie möchten, dass Ihre Ideen in der Sprache, in der sie sich befinden, klar ausgedrückt werden. Dies bedeutet die Verwendung von Redewendungen in der Hostsprache.

Nehmen Sie die beliebte Underscore-Bibliothek: js und lua . Der lua-Port ist zum größten Teil funktional gleichwertig . Aber wenn es angebracht ist, unterscheiden sich die Implementierungen geringfügig. Beispielsweise:

_.toArray()

wird

_.to_array()

Diese Änderung macht den Namen der Funktion mehr das Gefühl heimisch zu Lua Programmierern.

Ebenso erfordert _.each () ein Objekt, ein Array oder etwas Array-ähnliches in JavaScript, aber _.each () in Lua kann auch einen Iterator verwenden - ein Mechanismus, der in JavaScript nicht verfügbar war, als die ursprüngliche Underscore-Bibliothek verwendet wurde wurde erstellt.

Der Lua-Autor übersetzte vernünftig, was der ursprüngliche Autor beabsichtigt hätte, wenn er es in Lua geschrieben hätte. Das ist der Schlüssel. Fragen Sie sich nach der ursprünglichen Absicht und setzen Sie diese Absicht dann in die Sprache Ihrer Wahl um - Redewendungen und so weiter. Abhängig von der Quell- und Zielsprache kann dies das Hinzufügen, Bearbeiten oder Entfernen von Features bedeuten.

Denken Sie daran, dass sprachübergreifende Benutzer selten sind. Die meisten Benutzer verwenden die eine oder andere Sprache. Für sie sind die Unterschiede egal. Wenn jemand beides verwendet, ist er wahrscheinlich so geschickt, dass er Ihre Übersetzung zu schätzen weiß. Es ist nicht anders als das Übersetzen gesprochener Sprachen. Einige Ideen sind nicht direkt übersetzbar. Die besten Übersetzer halten an der Absicht des Originals fest und nicht an einer wortwörtlichen Übersetzung, die zum Scheitern verurteilt ist.

Scant Roger
quelle