Fish-shell: Variabel skrip-lokal tidak diganti dengan benar saat fungsi dipanggil

Dibuat pada 18 Jun 2018  ·  3Komentar  ·  Sumber: fish-shell/fish-shell

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 .

question

Semua 3 komentar

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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat