Bagaimana cara mendefinisikan metode pada satu baris di Ruby?

92

Apakah def greet; puts "hello"; endsatu-satunya cara untuk mendefinisikan metode dalam satu baris di Ruby?

RyanScottLewis
sumber
11
Seperti yang Anda lihat dari jawabannya, Anda dapat mendefinisikan metode dengan cara yang berbeda dalam satu baris, tetapi pertanyaannya adalah, haruskah Anda? Definisi apa pun harus ditulis dengan cara yang jelas dan bersih untuk alasan pemeliharaan dan keterbacaan, jadi jika baris tunggal menjadi sulit digunakan atau membingungkan, sebarkan. Beberapa bahasa tampaknya mendorong pengkodean singkat sebagai cara untuk menjadi pengkodean kode, tetapi gaya pengkodean Ruby mendorong keanggunan, keterbacaan dan pemeliharaan di atas studi. Capai tiga yang pertama dan kami akan tunduk kepada Anda.
Manusia Timah

Jawaban:

104

Anda dapat menghindari penggunaan titik koma jika menggunakan tanda kurung:

def hello() :hello end
horseyguy
sumber
1
Ini lebih lama daripada menggunakan titik koma ...?
Apollys mendukung Monica
76

Berikan saja jawaban baru yang lengkap:

Secara umum hindari metode baris tunggal. Meskipun mereka agak populer di alam liar, ada beberapa kekhasan tentang sintaks definisi mereka yang membuat penggunaannya tidak diinginkan. Bagaimanapun - tidak boleh ada lebih dari satu ekspresi dalam metode baris tunggal .

# bad
def too_much; something; something_else; end

# okish - notice that the first ; is required
def no_braces_method; body end

# okish - notice that the second ; is optional
def no_braces_method; body; end

# okish - valid syntax, but no ; make it kind of hard to read
def some_method() body end

# good
def some_method
  body
end

Satu pengecualian untuk aturan tersebut adalah metode badan kosong.

# good
def no_op; end

Dari bbatsov / ruby-style-guide .

Sergey Alekseev
sumber
39
def add a,b; a+b end

Titik koma adalah terminator pernyataan sebaris untuk Ruby

Atau Anda bisa menggunakan define_methodmetode ini. (Sunting: Yang ini tidak digunakan lagi di ruby ​​1.9)

define_method(:add) {|a,b| a+b }
edgerunner
sumber
4
Tampaknya tidak digunakan lagi di Ruby 2+
michau
9

Cara lain:

define_method(:greet) { puts 'hello' }

Dapat digunakan jika Anda tidak ingin memasukkan cakupan baru untuk metode saat mendefinisikannya.

Victor Deryagin
sumber
NoMethodError: metode pribadi `define_method 'yang dipanggil untuk Object: Class di Ruby 1.9.3
Jared
3
define_methodtelah "diprivatisasi" di Ruby 1.9
edgerunner
8

Cara lain:

def greet() return 'Hello' end
Josh D
sumber
13
Di Ruby, nilai yang dikembalikan dari suatu metode adalah nilai yang dikembalikan oleh pernyataan terakhir. Anda tidak perlu di returnsini karena ini bukan klausa penjaga.
Damien
1
Dipilih karena, meskipun tidak diperlukan , returndapat menambah keterbacaan bagi mereka yang kurang berpengalaman (atau akrab dengan) Ruby. Itu salah satu hal YMMV ...
Potherca