รักษา API กับการใช้สำนวนในพอร์ต


12

ฉันกำลังทำงานบนพอร์ตจาก Python ถึง Rust และพบกับโค้ดบางอย่างที่ไม่สามารถแสดงออกได้อย่างเป็นธรรมชาติใน Rust ตามที่ทำได้ใน Python

กรณีนี้มีการใช้พารามิเตอร์เริ่มต้น:

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

ในสนิมคุณอาจใช้สิ่งนี้โดยใช้เครื่องมือสร้าง:

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

มันบอกว่าอยู่ที่ไหนที่เป็นสนิมสำนวน?
ขีดตกต่ำสุดขั้ว Sampaoli

ฉันขอโทษฉันต้องเข้าใจผิด คุณโพสต์บางรหัสสนิมพร้อมกับภาวะที่กลืนไม่เข้าคายไม่ออก: สภาพอากาศที่คุณต้องการรักษา API สำหรับพอร์ตหรือคุณต้องการใช้สำนวนของภาษา porting รหัสนั้นดูไม่เหมือนกรณีใดกรณีหนึ่ง หากนี่เป็นการตีความที่ถูกต้องวัตถุประสงค์ของตัวอย่างโค้ดนั้นคืออะไร มันอธิบายอะไรและเกี่ยวข้องกับคำถามจริงอย่างไร
ขีดตกต่ำสุด Sampaoli

คำตอบ:


18

คุณต้องการให้ความคิดของคุณแสดงออกอย่างชัดเจนในภาษาที่โฮสต์พวกเขา นั่นหมายถึงการใช้สำนวนภาษาเจ้าบ้าน

ใช้ห้องสมุดเน้นยอดนิยม: jsและหลัว พอร์ตหลัวเป็นหน้าที่เทียบเท่าส่วนใหญ่ แต่เมื่อเหมาะสมการใช้งานจะแตกต่างกันเล็กน้อย ตัวอย่างเช่น:

_.toArray()

กลายเป็น

_.to_array()

การเปลี่ยนแปลงนี้ทำให้ชื่อฟังก์ชั่นรู้สึกพื้นเมืองมากขึ้นสำหรับโปรแกรมเมอร์ Lua

ในทำนองเดียวกัน_.each ()ต้องใช้วัตถุอาร์เรย์หรือบางอย่างที่เหมือนใน JavaScript แต่_.each ()ใน Lua ยังสามารถใช้ตัววนซ้ำ - กลไกที่ไม่พร้อมใช้งานใน JavaScript เมื่อไลบรารี Underscore ดั้งเดิม ถูกสร้าง.

ผู้เขียน Lua แปลอย่างสมเหตุสมผลว่าผู้เขียนต้นฉบับตั้งใจไว้ว่าถ้าพวกเขาเขียนเป็นภาษาลัวะ นั่นคือกุญแจสำคัญ ถามตัวเองเกี่ยวกับความตั้งใจดั้งเดิมแล้วนำความตั้งใจนั้นไปใช้ในภาษาที่คุณเลือก - สำนวนและทั้งหมด ทั้งนี้ขึ้นอยู่กับแหล่งที่มาและภาษาเป้าหมายสิ่งนี้อาจหมายถึงการเพิ่มแก้ไขหรือลบคุณลักษณะ

โปรดจำไว้ว่าผู้ใช้ข้ามภาษาจะหายาก ผู้ใช้ส่วนใหญ่จะใช้หนึ่งภาษาหรืออื่น ๆ สำหรับพวกเขาความแตกต่างไม่สำคัญ หากมีคนใช้ทั้งคู่พวกเขาอาจจะซับซ้อนพอที่จะชื่นชมการแปล มันไม่ต่างไปจากการแปลภาษาพูด แนวคิดบางอย่างไม่สามารถแปลได้โดยตรง นักแปลที่ดีที่สุดต้องยึดมั่นในเจตนาของต้นฉบับไม่ใช่การแปลตามตัวอักษรคำต่อคำอีกต่อไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.