Saya akan mengawali ini langsung dengan "Saya tidak tahu apakah ini desain, tapi saya benar-benar bingung."
set -l foo
function print_foo
echo "Evaluating print_foo"
echo "inner foo: $foo"
end
set foo "foo"
echo "setting foo to \"$foo\""
print_foo
Ini mencetak yang berikut:
setting foo to "foo"
Evaluating print_foo
inner foo:
Seperti yang saya pahami, baris pertama skrip mendefinisikan variabel lokal ke skrip bernama foo
. Sementara blok fungsi mendefinisikan ruang lingkup, deklarasi ruang lingkup baru tidak menghapus variabel yang ditentukan dalam ruang lingkup induk.
Saya dapat mengerti jika variabel foo
tidak didefinisikan jika saya memanggil print_foo
dari luar skrip ini (setelah mengambilnya), meskipun saya akan menganggap itu sebagai bug karena "referensi" untuk itu variabel masih ada dan oleh karena itu tidak boleh dibersihkan dari sampah. Tapi saya tidak mengerti mengapa ketika print_foo
dipanggil dari dalam file skrip yang sama dengan yang print_foo
didefinisikan, nilainya tidak dipertahankan.
Selain itu, saya kesal karena perilaku di bawah ini berbeda:
set -l foo "foo"
for i in ""
echo "Inner foo: \"$foo\""
end
mencetak Inner foo: "foo"
, meskipun blok for
juga mendefinisikan lingkup baru seperti yang dilakukan blok function
.
Lihat bendera --no-scope-shadowing
di man function
. Ini adalah dengan desain. Fakta bahwa Anda mendefinisikan foo
dengan lingkup lokal daripada global berarti setara dengan ini:
function bar
set -l foo baz
print_foo
end
Apakah desainnya masuk akal adalah pertanyaan yang berbeda :senyum:
Ya, ini adalah dengan desain.
@mqudsi : Jika Anda ingin fungsi mewarisi salinan variabel, gunakan function --inherit-variable
atau ekspor variabel. Jika Anda ingin dapat mengubah variabel, Anda harus menjadikannya global.
Luar biasa, terima kasih teman-teman.