Aralıklar neden boru kitaplığı işlevselliği için kullanılamaz?


10

Jonathan Boccara ( Fluent C ++ yazarı ) pipe adlı bir kütüphane yazdı .

Deponun ana sayfasında yer alan bu "borular", aynı görünse bile aralıkların kullanımı gibi değildir: Tembel çekmeye değil, daha çok itmeye dayalıdır. Ancak, çeşitli 'boru' işlemleri gerçekleştirmek için aralık kütüphanesini kullanamayacağı belirtilmektedir . Örneğin:

  • unzip - Sıkıştırılmış bir girdi alın - esasen bir dizi k-tuples - ve k ayrı, bağımsız çıktılar üretin.
  • fork - Bir kabın / aralığın birden çok (bağımsız) kopyasını üretir.

Prensipte durumun neden böyle olduğunu tam olarak anlamıyorum. (Tabii ki son yineleyici / sentinel'i alamadığınız aralıklar hariç.)

Yanıtlar:


7

Tartışılan şey, temel olarak itme tabanlı işleme metodolojisi ile çekme tabanlı olan arasındaki farktır. Bu borular kütüphanesi gibi bir push sisteminde, bir işleme zinciri oluşturursunuz ve her bir işlem adımı verilerini doğrudan bir sonrakine iter. Aralık gibi bir çekme sisteminde, gerektiğinde erişebileceğiniz ve değiştirebileceğiniz bir veri temsili oluşturursunuz. İşleme tek başına gerçekleşmez; sadece biri menzili tüketmeye çalıştığında olur.

unzipVe forkoperasyonlar hem bire çok operasyon şunlardır: bunlar tek girişi çekmek ve pek çok işleme operasyonları eşlersiniz.

Bir itme sistemi olarak, boru kütüphanesi, API'sının yapısı nedeniyle bire çok işlemleri gerçekleştirebilir. Bir işlem, bir işlev çağrısı ile temsil edilir; giriş kullanım noktası tarafından ima edilir ( >>=bir işlemci kullanarak veya bir işlemciye geçirilir). Fonksiyonun parametreleri çıktısını tanımlar (işlemcinin kendisi için amaçlanan parametreleri yok saymak). C ++ işlevlerinde isteğe bağlı sayıda parametre olabileceğinden, bire çok eşleme işlemi doğal olarak düşer. Çeşitli çıktılar için uygun işlemcileri sağlarsınız.

Bir çekme sistemi olarak, aralıklar dönüş değerlerine dayanır. C ++ 'da birden çok değer döndürmek için dil mekanizması yoktur, bu yüzden yapabileceğimiz en iyi şey birden çok değeri temsil eden bir "değer" döndürmektir.

Bununla birlikte, aralık adaptörü zinciri sonuçta aralıklara giren girdilere dayanır . Ve birden çok değeri temsil eden bir "değer" in kendisi bir aralık değildir. Aralık içerebilir, ancak bu bir aralık oluşturmaz.

Yani şimdi bu kesinlikle "aralık değil" tipini almalı ve tüm adaptörlerinizin onunla çalışmasını sağlamalısınız. Aralık bağdaştırıcısı uygulamak, bu işlemi tür boyunca yayınlamalı ve çoktan çoğa bir işlem oluşturmalıdır. Bunu yapmak kolay değil.

Ama daha da önemlisi ... muhtemelen istediğin bu değil . Eğer forkbir aralık varsa , neredeyse kesinlikle çoğaltılan aralıklarda farklı işlemler yapmak istersiniz. Ve bu |işlemi yapmak için operasyonu kullanma şansını tamamen kapatıyor . Bu aralık gruplarının belirli kısımlarına adaptörler uygulamak için yollar oluşturmanız gerekecektir. Ve bu yollar gittikçe artan bir itme tabanlı işlemci gibi görünecek.

Günün sonunda, bir çekme tarzı sistemin her seviyede sadece bir çıkışı vardır. Bu, böyle bir API'nin temel kavramının sadece bir parçasıdır: her işlem adımı bir aralık oluşturur . Bunun avantajları vardır (tembel işleme), ancak bire çok işlemleri temsil etmek zayıf alanlarından biridir.

Aralıkların kesinlikle bir unzipişlevi olabilir ( forkgerçekten sadece aralığı kopyalar). Ancak bir |stil adaptörü olmazdı ; bazı ayrıştırılabilir tipte bir aralık alan ve bir dizi aralık döndüren bir işlev olacaktır. Onlarla daha fazla işlem yapmak istiyorsanız, tuple değerini bir değerde saklamanız, tek tek öğelere erişmeniz ve uygun gördüğünüz şekilde kullanmanız gerekir.

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.