Bir bağlantı noktasında deyimleri kullanma ile API'yi koruma


12

Python Rust için bir bağlantı noktası üzerinde çalışıyorum ve doğal olarak Python gibi Rust olarak ifade edilemez bazı kod koştu.

Bunun bir örneği varsayılan parametreleri kullanmaktır:

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

Rust'ta bunu bir oluşturucu kullanarak uygulayabilirsiniz:

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

Sınıfı Python'da kullanmak için:

foo = Foo("Hello, World!")

Ancak Rust'da şöyle bir şey yazmanız gerekir:

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

Bu şu soruyu doğurur: bir bağlantı noktası için bir API bulundurmak daha mı iyi, yoksa taşıma dilinin deyimlerini kullanmak daha mı iyi? API'nın ne kadar iyi tanınacağına bağlı mı?


2
Bir sınıfın API'si, kodda nasıl ifade edildiğiyle değil, onu nasıl kullandığınızdır. Yani, bu çevirinin son derece farklı ve kabul edilemez derecede hantal bir ABI'si var.
Tekilleştirici

Bunun deyimsel Rust olduğu nerede söylenir?
Nadir Sampaoli

Üzgünüm, yanlış anlamış olmalıyım. Bir ikilemle birlikte bazı Rust kodu yayınladınız: hava durumu bir bağlantı noktası için bir API koruyacaksınız veya taşıma dilinin deyimlerini kullanacaksınız . Bu kod bu iki durumdan hiçbirine benzemiyor. Bu doğru yorum ise, bu kod örneğinin amacı nedir? Neyi anlatıyor ve asıl soru ile nasıl bir ilişkisi var?
Nadir Sampaoli

Yanıtlar:


18

Fikirlerinizin onları barındıran dilde açıkça ifade edilmesini istiyorsunuz. Bu, ana bilgisayar dili deyimlerini kullanmak anlamına gelir.

Popüler Alt Çizgi kütüphanesini kullanın: js ve lua . Lua portu çoğunlukla fonksiyonel olarak eşdeğerdir . Ancak uygun olduğunda uygulamalar biraz farklıdır. Örneğin:

_.toArray()

olur

_.to_array()

Bu değişiklik, işlev adının Lua programcılarına daha doğal gelmesini sağlar.

Benzer şekilde, _.each () JavaScript'te bir nesne, dizi veya dizi benzeri bir şey gerektirir, ancak Lua'daki _.each () de bir yineleyici alabilir - orijinal Alt Çizgi kitaplığı JavaScript'te bulunmayan bir mekanizma yaratıldı.

Lua yazarı, orijinal yazarın Lua'da yazmış olsaydı, ne yazacağını mantıklı bir şekilde tercüme etti . Anahtar bu. Kendinize asıl niyet hakkında soru sorun ve daha sonra bu amacı kendi tercih ettiğiniz dilde (deyimler ve diğerleri) uygulayın. Kaynak ve hedef dile bağlı olarak, bu özellik ekleme, düzenleme veya kaldırma anlamına gelebilir.

Diller arası kullanıcıların nadir olacağını unutmayın. Çoğu kullanıcı bir dili veya diğerini kullanır. Onlar için farklar önemli değil. Birisi her ikisini de kullanırsa, muhtemelen çevirinizi takdir edecek kadar sofistike olur. Konuşulan dilleri çevirmekten farklı değil. Bazı fikirler doğrudan çevrilemez. En iyi çevirmenler kıyamet kelimesi kelimesine değişmez bir tercümeye değil, orijinalin amacına sadık kalırlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.