Tetapi ia boleh dilaksanakan dengan cara ini dalam python atau js!
Baca sahaja dalam Python
Berikut adalah tekaan mengapa Ruby melakukan ini?
Dalam Ruby, def kaedah yang dihasilkan hanya boleh mengakses pembolehubah global. Kaedah yang dijana oleh define_method dan proc yang dijana oleh -> (param) {} atau lambda { |param| } mempunyai penutupan dan boleh mengakses pembolehubah luar.
Saya rasa ini kerana Ruby berpendapat bahawa situasi yang paling biasa ialah anda tidak perlu mengakses pembolehubah luar, jadi def tidak memberi anda akses Ini mempunyai kelebihan:
Tidak akan kacau dengan pembolehubah luar secara tidak sengaja seperti js. Untuk mengelakkan ini dalam JavaScript, semua pembolehubah yang digunakan dalam kandungan mesti tidak ditentukan dalam pengepala function, yang sangat bertele-tele.
Tidak perlu membuat penutupan, menjimatkan overhed.
Bagi lambda dengan penutup, itu perkara biasa.
Bagi define_method, saya rasa ia adalah kerana
define_method Kerana ia dipanggil metaprogramming, terdapat peluang yang lebih besar untuk menggunakan pembolehubah luar (Pada asalnya, menggunakan metaprogramming bermakna malas dan kurang menaip. Jika anda tidak boleh menggunakan pembolehubah luar dan perlu memasukkannya sebagai parameter, ia akan meletihkan.) Jadi.
Kadangkala menyusahkan bahawa
takrif kaedah tidak boleh mengandungi penutupan, tetapi biasanya tidak perlu, jadi biarkan lebih lama define_method mengandungi penutupan.
define_method Selain define_method (symbol) { |param| }, ia juga boleh ditulis sebagai define_method(symbol, method) Antaranya, method lebih biasa digunakan untuk lulus dalam lambda, jika define_method sendiri tidak mempunyai penutupan, ia akan menjadi sangat tidak konsisten Said, jadi biarkan ia membawa anda.
Dalam gaya delima yang cantik, $ sangat menarik perhatian. Bos Ruby tahu bahawa pembolehubah global sangat diperlukan, tetapi dia juga takut disalahgunakan, jadi dia bermain sedikit;). Ia melibatkan pengetahuan skop pembolehubah ruby Kelebihan ruby adalah kompleks dan unik.
Buat nota: Perbezaan antara def dan def_method: def ialah kata kunci yang digunakan untuk mentakrifkan kaedah def_method ialah kaedah, fungsinya adalah untuk menjana kaedah baharu, kod dalam def diasingkan sepenuhnya daripada konteks (hanya kod dengan @ Pembolehubah dengan Meida); dan define_method lebih terbuka, dan saya bersedia untuk bertemu rakan tanpa sebarang pengubahsuaian.
def membuka skop baharu
Jika anda ingin mengakses n, anda perlu menggunakan skop meratakan
Saya juga seorang pemula, mari lihat apa yang pakar lain katakan.
Baca sahaja dalam Python
Berikut adalah tekaan mengapa Ruby melakukan ini?
Dalam Ruby,
def
kaedah yang dihasilkan hanya boleh mengakses pembolehubah global. Kaedah yang dijana olehdefine_method
dan proc yang dijana oleh-> (param) {}
ataulambda { |param| }
mempunyai penutupan dan boleh mengakses pembolehubah luar.Saya rasa ini kerana Ruby berpendapat bahawa situasi yang paling biasa ialah anda tidak perlu mengakses pembolehubah luar, jadi
def
tidak memberi anda akses Ini mempunyai kelebihan:function
, yang sangat bertele-tele.Bagi lambda dengan penutup, itu perkara biasa.
Bagi
define_method
, saya rasa ia adalah keranadefine_method
Kerana ia dipanggil metaprogramming, terdapat peluang yang lebih besar untuk menggunakan pembolehubah luar (Pada asalnya, menggunakan metaprogramming bermakna malas dan kurang menaip. Jika anda tidak boleh menggunakan pembolehubah luar dan perlu memasukkannya sebagai parameter, ia akan meletihkan.) Jadi.define_method
mengandungi penutupan.define_method
Selaindefine_method (symbol) { |param| }
, ia juga boleh ditulis sebagaidefine_method(symbol, method)
Antaranya,method
lebih biasa digunakan untuk lulus dalam lambda, jikadefine_method
sendiri tidak mempunyai penutupan, ia akan menjadi sangat tidak konsisten Said, jadi biarkan ia membawa anda.@Andrew_375683 betul.
Terutamanya soal skop
Tetapi berikut ialah cara mudah untuk menyelesaikannya. Cuma tukarkan n kepada fungsi
Ini soalan hangat. Saya hanya pergi ke sana dan beberapa orang menjawab saya apabila saya kembali.
Anda fikir n dalam kod anda ialah pembolehubah global, tetapi malangnya ia tidak
Jika anda perlu mengubah suainya, tambahkan $ sebagai awalan:
Dalam gaya delima yang cantik, $ sangat menarik perhatian. Bos Ruby tahu bahawa pembolehubah global sangat diperlukan, tetapi dia juga takut disalahgunakan, jadi dia bermain sedikit;). Ia melibatkan pengetahuan skop pembolehubah ruby Kelebihan ruby adalah kompleks dan unik.
@andrewzhyl cakap baik, suka.
Buat nota: Perbezaan antara def dan def_method: def ialah kata kunci yang digunakan untuk mentakrifkan kaedah def_method ialah kaedah, fungsinya adalah untuk menjana kaedah baharu, kod dalam def diasingkan sepenuhnya daripada konteks (hanya kod dengan @ Pembolehubah dengan Meida); dan define_method lebih terbuka, dan saya bersedia untuk bertemu rakan tanpa sebarang pengubahsuaian.