Saya menulis paket gambar dengan beberapa bagian, dan saya memiliki operator dan tipe data yang tersebar di seluruh penjuru. Namun saya tidak ingin para pengguna menambahkan modul yang sesuai setiap waktu, karena akan sangat berantakan, misalnya saya memiliki Point
kelas, Monoid
peran dan Style
kelas di jalur yang berbeda seperti ini
unit module Package::Data::Monoid;
# $?FILE = lib/Package/Data/Monoid.pm6
role Monoid {...}
unit module Package::Data::Point;
# $?FILE = lib/Package/Data/Point.pm6
class Point {...}
unit module Package::Data::Style;
# $?FILE = lib/Package/Data/Style.pm6
class Style {...}
Saya ingin memiliki haskell
pembuka seperti lib/Package/Prelude.pm6
dengan efek bahwa saya dapat menulis skrip seperti itu
use Package::Prelude;
# I can use Point right away, Style etc...
bukannya melakukan
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
# I can too use point right away, but for users not knowing the
# inner workings it's too overwhelming
Saya sudah mencoba banyak hal:
- Versi ini tidak memberi saya efek yang tepat, saya harus mengetikkan seluruh jalur ke titik, yaitu,
Package::Data::Point
...
unit module Package::Prelude;
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
- Versi ini memberi saya
Point
segera, tetapi saya mendapatkan masalah dengan operator dan sebagainya, juga saya hanya ingin menambahkan semuanya secara otomatis dari rutinitas yang diekspor dalam paket contoh yang disebutkan.
# $?FILE = lib/Package/Prelude.pm6
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
sub EXPORT {
hash <Point> => Point
, <Style> => Style
, <mappend> => &mappend
...
}
Apakah Anda tahu cara yang lebih baik dan cepat untuk mendapatkan file seperti pembuka?
unit class Package::Data::Point
. Anda tidak harus menggunakanmodule
.Jawaban:
Menggunakan
EXPORT
berada di arah yang benar. Hal-hal penting yang perlu diketahui adalah:Jadi resepnya adalah:
use
semua modul di dalamnyaEXPORT
EXPORT
Sebagai contoh, saya membuat modul
Foo::Point
, termasuk operator dan kelas:Dan, hanya untuk menunjukkannya dapat bekerja dengan banyak modul, juga
Foo::Monad
:Tujuannya adalah membuat ini bekerja:
Yang bisa dicapai dengan menulis a
Foo::Prelude
yang berisi:Ada beberapa keanehan di sini untuk dijelaskan:
sub
memiliki deklarasi implisit$_
,$/
dan$!
. Mengekspor ini akan menghasilkan kesalahan bentrokan simbol waktu kompilasi ketika moduluse
'd. Blok A hanya memiliki implisit$_
. Dengan demikian kita membuat hidup kita lebih mudah dengan blok kosong bersarang.grep
untuk memastikan kita tidak mengekspor$_
simbol yang dinyatakan secara implisit (berkat blok bersarang, itu satu-satunya yang harus kita perhatikan).::
adalah cara untuk merujuk ruang lingkup saat ini (etimologi:::
adalah pemisah paket).::.pairs
dengan demikian memperolehPair
objek untuk setiap simbol dalam lingkup saat ini.Ada mekanisme re-ekspor berspekulasi yang mungkin muncul dalam rilis bahasa Raku di masa depan yang akan menghilangkan kebutuhan untuk sedikit boilerplate ini.
sumber