Baru mengenal ruby, kenakan sarung tangan pemula Anda.
Apakah ada perbedaan (tidak jelas atau praktis) antara dua cuplikan berikut?
my_array = [:uno, :dos, :tres]
my_array.each { |item|
puts item
}
my_array = [:uno, :dos, :tres]
my_array.each do |item|
puts item
end
Saya menyadari sintaks brace akan memungkinkan Anda menempatkan blok pada satu baris
my_array.each { |item| puts item }
tetapi di luar itu, adakah alasan kuat untuk menggunakan satu sintaks di atas sintaks yang lain?
ruby
coding-style
Alan Storm
sumber
sumber
each
bekerja dengan tanda kurung tetapi tidak dengando
-end
(ruby) , Definisi blok - perbedaan antara tanda kurung dando
-end
? , Ruby multiline block withoutdo
end
, Apa perbedaan atau nilai gaya pengkodean blok ini di Ruby? dan blok Ruby serta argumen yang tidak diberi tanda kurung .Jawaban:
Buku masak Ruby mengatakan sintaks braket memiliki urutan prioritas yang lebih tinggi daripada
do..end
Contoh kedua hanya berfungsi jika tanda kurung digunakan,
1.upto(3) { |x| puts x }
sumber
Ini adalah pertanyaan yang agak lama tetapi saya ingin mencoba menjelaskan lebih banyak tentang
{}
dando .. end
seperti yang dikatakan sebelumnya
tapi bagaimana yang satu ini membuat perbedaan:
dalam hal ini, metode1 akan dipanggil dengan blok
do..end
dan metode2 akan diteruskan ke metode1 sebagai argumen! yang setara denganmethod1(method2){ puts "hi" }
tetapi jika Anda mengatakan
kemudian metode2 akan dipanggil dengan blok tersebut kemudian nilai yang dikembalikan akan diteruskan ke metode1 sebagai argumen. Yang mana setara dengan
method1(method2 do puts "hi" end)
#### keluaran ####
sumber
Umumnya, konvensi digunakan
{}
saat Anda melakukan operasi kecil, misalnya, panggilan metode atau perbandingan, dll. Jadi ini sangat masuk akal:Tetapi jika Anda memiliki logika yang sedikit rumit yang mengarah ke beberapa baris, gunakan
do .. end
seperti:Pada dasarnya, itu turun ke, jika logika blok Anda pergi ke beberapa baris dan tidak dapat dipasang pada baris yang sama maka gunakan
do .. end
dan jika logika blok Anda sederhana dan hanya satu baris kode sederhana kemudian gunakan{}
.sumber
result_with_some_condition = method{|c| c.do_something || whateever}; result_with_some_condition.another_method
itu hanya membuatnya sedikit lebih mudah dimengerti. Tetapi secara umum saya akan menghindari kecelakaan kereta api.Ada dua gaya umum untuk memilih
do end
vs.{ }
untuk blok di Ruby:Gaya pertama dan paling umum dipopulerkan oleh Ruby on Rails, dan didasarkan pada aturan sederhana antara satu baris vs. banyak baris:
{ }
untuk blok garis tunggaldo end
untuk blok multi-barisIni masuk akal karena do / end terbaca buruk dalam satu baris, tetapi untuk blok multi-baris, membiarkan penutup
}
tergantung pada barisnya sendiri tidak konsisten dengan semua hal lain yang digunakanend
di ruby, seperti definisi modul, kelas & metode (def
dll. .) dan struktur kontrol (if
,while
,case
, dll)Gaya kedua, yang lebih jarang terlihat dikenal sebagai semantik, atau " Weirich Braces ", yang diusulkan oleh almarhum, ahli ruby hebat Jim Weirich:
do end
untuk blok prosedural{ }
untuk blok fungsionalIni berarti bahwa ketika blok dievaluasi untuk nilai kembaliannya , blok tersebut harus dapat dirantai, dan tanda
{}
kurung kurawal lebih masuk akal untuk rangkaian metode.Di sisi lain, ketika blok dievaluasi untuk efek sampingnya , maka nilai kembali tidak ada konsekuensinya, dan blok hanya "melakukan" sesuatu, jadi tidak masuk akal untuk dirantai.
Perbedaan dalam sintaks ini menyampaikan makna visual tentang evaluasi blok, dan apakah Anda harus peduli dengan nilai kembaliannya atau tidak.
Misalnya, di sini nilai kembali dari blok tersebut diterapkan ke setiap item:
Namun, di sini tidak menggunakan nilai kembali blok tersebut. Ini beroperasi secara prosedural, dan melakukan efek samping dengannya:
Manfaat lain dari gaya semantik adalah Anda tidak perlu mengganti tanda kurung untuk melakukan / mengakhiri hanya karena garis telah ditambahkan ke blok.
Sebagai pengamatan, blok yang berfungsi secara kebetulan sering kali merupakan satu baris, dan blok prosedural (misalnya config) adalah multi-baris. Jadi, mengikuti gaya Weirich akhirnya terlihat hampir sama dengan gaya Rails.
sumber
Saya menggunakan gaya Weirich selama bertahun-tahun, tetapi baru saja beralih dari ini untuk selalu menggunakan kawat gigi . Saya tidak ingat pernah menggunakan info dari gaya blok, dan definisinya agak kabur. Sebagai contoh:
Apakah ini prokudual atau fungsional?
Dan hal jumlah baris tidak berguna menurut saya. Saya tahu, apakah ada 1 atau lebih garis, dan mengapa tepatnya saya harus mengubah gaya hanya karena saya telah menambahkan atau menghapus garis?
sumber