维护API与在端口中使用成语


12

我正在研究从Python到Rust的移植,并遇到了一些代码,这些代码在Rust中无法像在Python中那样自然地表达。

一种情况是使用默认参数:

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

在Rust中,您可以使用构建器来实现:

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,
    }
  }
}

要在Python中使用该类,只需:

foo = Foo("Hello, World!")

但是,在Rust中,您需要编写如下内容:

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

这就引出了一个问题:为端口维护API更好还是使用移植语言的习语更好?它是否取决于API的知名度?


2
类的API是如何使用它的,而不是如何用代码表示的。因此,该翻译与ABI截然不同且笨拙。
Deduplicator 2015年

在哪里说那是惯用的Rust?
Nadir Sampaoli 2015年

对不起,我一定误会了。您发布了一些Rust代码以及一个难题:天气情况下,您将维护端口的API使用移植语言的习语。该代码看起来与上述两种情况都不一样。如果这是正确的解释,那么该代码示例的目的是什么?它描述了什么?它与实际问题有什么关系?
Nadir Sampaoli 2015年

Answers:


18

您希望您的想法用承载它们的语言清晰表达。这意味着使用宿主语言习语。

以流行的Underscore库为例:jslua。lua端口在功能上大部分是等效。但是适当时,实现略有不同。例如:

_.toArray()

变成

_.to_array()

所做的更改使函数名称对Lua程序员而言更加原生

同样,_.each()在JavaScript中需要对象,数组或类似数组的东西,但是Lua中的_.each()也可以采用迭代器-当原始的Underscore库在JavaScript中不可用的机制已创建。

Lua作者明智地翻译了原作者用Lua编写的原意。那是关键。问问自己最初的意图,然后以您选择的语言(成语和所有语言)实施该意图。根据源语言和目标语言,这可能意味着添加,编辑或删除功能。

请记住,跨语言用户将很少见。大多数用户将使用一种或另一种语言。对于他们来说,差异并不重要。如果有人同时使用这两种软件,那么他们可能足够老练,可以欣赏您的翻译。这与翻译口语没有什么不同。有些想法不能直接翻译。最好的翻译人员坚持原始的意图,而不是注定的逐字直译。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.