포트에서 관용구를 사용하여 API 유지


12

Python에서 Rust까지의 포트에서 작업 중이며 Python 에서처럼 Rust에서 자연스럽게 표현할 수없는 코드가 발생했습니다.

한 가지 경우는 기본 매개 변수를 사용하는 것입니다.

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

파이썬에서 클래스를 사용하려면 다음과 같습니다.

foo = Foo("Hello, World!")

그러나 Rust에서는 다음과 같이 작성해야합니다.

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

이것은 질문을 낳는다 : 포트에 대한 API를 유지하는 것이 더 낫거나 포팅 언어의 관용구를 사용하는 것이 더 낫습니까? API가 얼마나 잘 알려진 지에 달려 있습니까?


2
클래스의 API는 코드로 표현되는 방식이 아니라 사용 방식입니다. 따라서이 번역은 엄청나게 다르고 단순히 용납 할 수없는 ABI입니다.
중복 제거기

그것이 관용적 녹이라고 어디서 말합니까?
Nadir Sampaoli

죄송합니다. 오해가 있었을 것입니다. Rust 코드와 함께 딜레마와 함께 포스팅했습니다. 날씨 는 포트에 대한 API를 유지 하거나 포팅 언어의 관용구를 사용합니다 . 이 코드는 두 경우 중 하나와 비슷하지 않습니다. 이것이 올바른 해석이라면, 그 코드 샘플의 목적은 무엇입니까? 설명은 무엇이며 실제 질문과 어떻게 관련이 있습니까?
Nadir Sampaoli

답변:


18

아이디어를 주최하는 언어로 아이디어를 명확하게 표현하기를 원합니다. 그것은 호스트 언어 관용구를 사용하는 것을 의미합니다.

인기있는 Underscore 라이브러리 인 jslua를 사용하십시오 . 루아 포트는 대부분 기능적으로 동일 합니다 . 그러나 적절한 경우 구현이 약간 다릅니다. 예를 들면 다음과 같습니다.

_.toArray()

된다

_.to_array()

이 변경으로 함수 이름이 Lua 프로그래머에게 더 기본적 으로 느껴집니다 .

마찬가지로 _.each () 에는 JavaScript에서 객체, 배열 또는 배열과 같은 것이 필요하지만 Lua의 _.each () 는 반복자가 될 수 있습니다.이 메커니즘은 원래 Underscore 라이브러리 일 때 JavaScript에서 사용할 수 없었던 메커니즘입니다. 창조되었다.

루아 작가는 원래 작가 루아 어로 쓴 경우 의도했던 것을 현명하게 번역 했습니다. 이것이 핵심입니다. 원래 의도에 대해 스스로에게 물어 본 다음 원하는 언어, 즉 숙어와 그 언어로 그 의도를 구현하십시오. 소스 및 대상 언어에 따라 기능 추가, 편집 또는 제거를 의미 할 수 있습니다.

언어를 다투어 사용하는 사용자는 거의 없습니다. 대부분의 사용자는 한 언어 또는 다른 언어를 사용합니다. 그들에게는 차이점이 중요하지 않습니다. 누군가 두 가지를 모두 사용한다면 번역에 감사 할 정도로 정교 할 것입니다. 구어를 번역하는 것과 다르지 않습니다. 일부 아이디어는 직접 번역 할 수 없습니다. 최고의 번역가들은 원래 단어 대 단어 리터럴 번역이 아니라 원래 의도를 고수합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.