Melanjutkan meme "Fitur tersembunyi ...", mari berbagi fitur bahasa pemrograman Ruby yang kurang dikenal namun bermanfaat.
Cobalah batasi diskusi ini dengan Ruby inti, tanpa Ruby apa pun.
Lihat juga:
- Fitur tersembunyi dari C #
- Fitur tersembunyi Jawa
- Fitur tersembunyi dari JavaScript
- Fitur tersembunyi Ruby on Rails
- Fitur tersembunyi dari Python
(Tolong, hanya satu fitur tersembunyi per jawaban.)
Terima kasih
Jawaban:
Dari Ruby 1.9 Proc # === adalah alias untuk panggilan Proc #, yang berarti objek Proc dapat digunakan dalam pernyataan kasus seperti:
sumber
Peter Cooper memiliki daftar trik Ruby yang bagus. Mungkin favorit saya miliknya adalah memungkinkan item tunggal dan koleksi untuk disebutkan. (Yaitu, perlakukan objek non-koleksi sebagai koleksi yang berisi objek itu saja.) Kelihatannya seperti ini:
sumber
items
adalah string, Anda tidak harus melampirkannya dengan [* ...] String.each tidak mengulangi karakter seperti yang diharapkan beberapa orang. Itu hanya mengembalikan dirinya ke blok.Tidak tahu seberapa tersembunyi ini, tapi saya merasa berguna ketika perlu membuat Hash dari array satu dimensi:
sumber
Hash[ [["apple","red"], ["banana","yellow"] ]
menghasilkan hasil yang sama.Salah satu trik yang saya suka adalah dengan menggunakan splat (
*
) expander pada objek selain Array. Berikut ini contoh pada pencocokan ekspresi reguler:Contoh lain termasuk:
sumber
text, number = *"text 555".match(/regexp/)[1..-1]
.text, number = "Something 981".scan(/([A-z]*) ([0-9]*)/).flatten.map{|m| Integer(m) rescue m}
Wow, tidak ada yang menyebut operator flip flop:
sumber
i == 3
dan beralih ke false setelahi != 3
dani == 15
. Mirip dengan flip-flop: en.wikipedia.org/wiki/Flip-flop_%28electronics%29Salah satu hal keren tentang ruby adalah Anda dapat memanggil metode dan menjalankan kode di tempat yang disukai oleh bahasa lain, seperti dalam metode atau definisi kelas.
Misalnya, untuk membuat kelas yang memiliki superclass yang tidak diketahui sampai waktu berjalan, yaitu acak, Anda bisa melakukan hal berikut:
Ini menggunakan
Array#sample
metode 1.9 (hanya 1.8.7, lihatArray#choice
), dan contohnya cukup dibuat tetapi Anda dapat melihat kekuatannya di sini.Contoh keren lainnya adalah kemampuan untuk menempatkan nilai parameter default yang tidak tetap (seperti bahasa lain yang sering diminta):
Tentu saja masalah dengan contoh pertama adalah bahwa ia dievaluasi pada waktu definisi, bukan waktu panggilan. Jadi, sekali superclass telah dipilih, ia tetap superclass itu untuk sisa program.
Namun, dalam contoh kedua, setiap kali Anda menelepon
do_something_at
,at
variabel akan menjadi waktu metode dipanggil (well, sangat sangat dekat dengannya)sumber
require 'activesupport'
Fitur mungil lainnya - konversikan
Fixnum
menjadi basis apa saja hingga 36:Dan seperti komentar Huw Walters, mengonversi dengan cara lain sama mudahnya:
sumber
String#to_s(base)
dapat digunakan untuk mengkonversi kembali ke integer;"1001001100101100000001011010010".to_i(2)
,"499602d2".to_i(16)
dll semua mengembalikan yang asliFixnum
.Hash dengan nilai default! Array dalam hal ini.
Sangat berguna dalam metaprogramming.
sumber
Unduh sumber Ruby 1.9, dan terbitkan
make golf
, maka Anda dapat melakukan hal-hal seperti ini:Baca
golf_prelude.c
untuk hal-hal yang lebih rapi bersembunyi.sumber
Tambahan menyenangkan lainnya dalam fungsi 1.9 Proc adalah Proc # curry yang memungkinkan Anda untuk mengubah argumen yang menerima Proc menjadi argumen yang menerima n-1. Ini dikombinasikan dengan tips Proc # === yang saya sebutkan di atas:
sumber
Operator Boolean pada nilai non boolean.
&&
dan||
Keduanya mengembalikan nilai ekspresi terakhir yang dievaluasi.
Itu sebabnya
||=
akan memperbarui variabel dengan nilai yang dikembalikan ekspresi di sisi kanan jika variabel tidak terdefinisi. Ini tidak didokumentasikan secara eksplisit, tetapi pengetahuan umum.Namun
&&=
tidak begitu banyak diketahui tentang.setara dengan
Ini sangat berguna untuk operasi destruktif yang tidak boleh dilanjutkan jika variabel tidak terdefinisi.
sumber
string &&= string + "suffix"
setara denganstring = string && string + "suffix"
. Itu&&
dan||
mengembalikan argumen kedua mereka dibahas dalam PickAx, hal. 154 (Bagian I - Aspek Ruby, Ekspresi, Eksekusi Bersyarat).Fungsi Symbol # to_proc yang disediakan Rails benar-benar keren.
Dari pada
Kamu bisa menulis:
sumber
require 'activesupport'
karena di situlah sebagian besar pembantu ini berasal.Satu yang terakhir - di ruby Anda dapat menggunakan karakter apa pun yang ingin Anda batasi string. Ambil kode berikut:
Jika Anda tidak ingin lepas dari tanda kutip ganda dalam string, Anda dapat menggunakan pembatas yang berbeda:
Selain menghindari pelarian pembatas, Anda dapat menggunakan pembatas ini untuk string multiline yang lebih bagus:
sumber
Saya menemukan menggunakan perintah define_method untuk secara dinamis menghasilkan metode yang cukup menarik dan tidak terlalu dikenal. Sebagai contoh:
Kode di atas menggunakan perintah 'define_method' untuk secara dinamis membuat metode "press1" melalui "press9." Alih-alih mengetik semua 10 metode yang essentailly berisi kode yang sama, perintah metode define digunakan untuk menghasilkan metode ini dengan cepat sesuai kebutuhan.
sumber
Gunakan objek Range sebagai daftar malas tak terbatas:
Info lebih lanjut di sini: http://banisterfiend.wordpress.com/2009/10/02/wtf-infinite-ranges-in-ruby/
sumber
module_function
Metode modul yang dideklarasikan sebagai module_function akan membuat salinan dirinya sebagai metode turunan pribadi di kelas yang menyertakan Modul:
Jika Anda menggunakan fungsi module_ tanpa argumen, maka metode modul apa pun yang muncul setelah pernyataan module_function akan secara otomatis menjadi fungsi module_functions sendiri.
sumber
module_function
(cara 2) adalah dengan hanya menggunakanextend self
(yang terlihat cukup bagus: D)Suntikan singkat, seperti:
Jumlah kisaran:
sumber
require 'backports'
:-)Peringatan: item ini terpilih sebagai # 1 Hack Paling Menghebohkan tahun 2008 , jadi gunakan dengan hati-hati. Sebenarnya, hindarilah seperti wabah, tetapi itu pasti Ruby Tersembunyi.
Superator Tambahkan Operator Baru ke Ruby
Pernah menginginkan operator jabat tangan super-rahasia untuk beberapa operasi unik dalam kode Anda? Suka bermain golf kode? Coba operator seperti - ~ + ~ - atau <--- Yang terakhir digunakan dalam contoh untuk membalik urutan item.
Saya tidak ada hubungannya dengan Proyek Superators selain mengaguminya.
sumber
Saya terlambat ke pesta, tetapi:
Anda dapat dengan mudah mengambil dua array dengan panjang yang sama dan mengubahnya menjadi hash dengan satu array memasok kunci dan yang lainnya nilainya:
(Ini berfungsi karena Array # zip "zip" nilai-nilai dari dua array:
Dan Hash [] dapat mengambil array seperti itu. Saya telah melihat orang melakukan ini juga:
Yang menghasilkan hasil yang sama, tetapi percikan dan ratakan sama sekali tidak perlu - mungkin mereka tidak di masa lalu?)
sumber
Hash vivifying otomatis di Ruby
Ini bisa sangat berguna.
sumber
module InfHash; def self.new; Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}; end; end
Merusak Array
Dimana:
Dengan menggunakan teknik ini kita dapat menggunakan penugasan sederhana untuk mendapatkan nilai tepat yang kita inginkan dari array bersarang dari kedalaman apa pun.
sumber
Class.new()
Buat kelas baru saat run time. Argumennya bisa berupa kelas untuk diturunkan, dan bloknya adalah badan kelas. Anda mungkin juga ingin melihat
const_set/const_get/const_defined?
agar kelas baru Anda terdaftar dengan benar, jadiinspect
mencetak nama dan bukan nomor.Bukan sesuatu yang Anda butuhkan setiap hari, tetapi cukup berguna saat Anda melakukannya.
sumber
MyClass = Class.new Array do; def hi; 'hi'; end; end
tampaknya setara denganclass MyClass < Array; def hi; 'hi'; end; end
.buat array angka berurutan:
set x ke [0, 1, 2, 3, 4, 5]
sumber
*
) pada dasarnyato_a
tetap menelepon .Banyak keajaiban yang Anda lihat di Rubyland ada hubungannya dengan metaprogramming, yang hanya menulis kode yang menulis kode untuk Anda. Ruby
attr_accessor
,attr_reader
danattr_writer
semua metaprogramming sederhana, dalam arti bahwa mereka membuat dua metode dalam satu baris, mengikuti pola standar. Rails melakukan banyak metaprogramming dengan metode manajemen hubungan sepertihas_one
danbelongs_to
.Tapi cukup mudah untuk membuat trik metaprogramming Anda sendiri menggunakan
class_eval
untuk mengeksekusi kode yang ditulis secara dinamis.Contoh berikut memungkinkan objek wrapper untuk meneruskan metode tertentu ke objek internal:
Metode ini
Wrapper.forwards
mengambil simbol untuk nama-nama metode dan menyimpannya dalammethods
array. Kemudian, untuk masing-masing yang diberikan, kita gunakandefine_method
untuk membuat metode baru yang tugasnya mengirim pesan, termasuk semua argumen dan blok.Sumber yang bagus untuk masalah metaprogramming adalah Why the Lucky Stiff's "Seeing Metaprogramming Clearly" .
sumber
menggunakan apa pun yang menanggapi
===(obj)
perbandingan kasus:Module
(dan dengan demikianClass
)Regexp
,Date
, dan banyak kelas-kelas lain mendefinisikan metode contoh: === (lainnya), dan semua bisa digunakan.Terima kasih kepada Farrel untuk pengingat
Proc#call
akan alias sepertiProc#===
di Ruby 1.9.sumber
Biner "ruby" (setidaknya MRI) mendukung banyak switch yang membuat perl one-liner cukup populer.
Yang signifikan:
put
s otomatis di akhir setiap iterasi loopBeberapa contoh:
Jangan ragu untuk google "ruby one-liners" dan "perl one-liners" untuk banyak contoh yang lebih bermanfaat dan praktis. Ini pada dasarnya memungkinkan Anda untuk menggunakan ruby sebagai pengganti yang cukup kuat untuk awk dan sed.
sumber
Metode send () adalah metode tujuan umum yang dapat digunakan pada Kelas atau Objek apa pun di Ruby. Jika tidak diganti, kirim () menerima string dan memanggil nama metode yang stringnya dilewatkan. Misalnya, jika pengguna mengklik tombol "Clr", string 'press_clear' akan dikirim ke metode send () dan metode 'press_clear' akan dipanggil. Metode send () memungkinkan cara yang dinamis dan menyenangkan untuk memanggil fungsi di Ruby.
Saya berbicara lebih banyak tentang fitur ini di Blogging Shoes: The Simple-Calc Application
sumber
Menipu beberapa kelas atau modul yang mengatakan itu membutuhkan sesuatu yang sebenarnya tidak diperlukan:
Ini berguna misalnya ketika membutuhkan A yang pada gilirannya membutuhkan B tetapi kami tidak membutuhkan B dalam kode kami (dan A tidak akan menggunakannya baik melalui kode kami):
Misalnya, Backgroundrb
bdrb_test_helper requires
'test/spec'
, tetapi Anda tidak menggunakannya sama sekali, jadi dalam kode Anda:sumber
Fixnum#to_s(base)
dalam beberapa kasus bisa sangat berguna. Salah satu kasus tersebut adalah menghasilkan token acak (semu) dengan mengubah angka acak menjadi string menggunakan basis 36.Token dengan panjang 8:
Token dengan panjang 6:
sumber
Menentukan metode yang menerima sejumlah parameter dan hanya membuang semuanya
hello
Metode di atas hanya perluputs
"hello"
di layar dan panggilansuper
- tetapi karena superclasshello
menentukan parameternya juga - namun karena sebenarnya tidak perlu menggunakan parameter itu sendiri - itu tidak harus memberi mereka nama.sumber