Jak zdefiniować metodę w jednym wierszu w Rubim?

92

Czy def greet; puts "hello"; endjest jedynym sposobem zdefiniowania metody w jednym wierszu w Rubim?

RyanScottLewis
źródło
11
Jak widać z odpowiedzi, możliwe jest zdefiniowanie metody na różne sposoby w jednym wierszu, ale pytanie brzmi: czy powinieneś? Każda definicja powinna być napisana w sposób jasny i przejrzysty ze względu na konserwację i czytelność, więc jeśli pojedyncza linia stanie się nieporęczna lub zagmatwana, należy ją rozłożyć. Niektóre języki wydają się zachęcać do zwięzłego kodowania jako sposobu na uczenie się kodowania, ale styl kodowania Ruby zachęca do elegancji, czytelności i łatwości utrzymania ponad starannością. Wykonaj pierwsze trzy, a pokłonimy się Tobie.
Tin Man

Odpowiedzi:

104

Możesz uniknąć konieczności używania średników, jeśli używasz nawiasów:

def hello() :hello end
koński
źródło
1
To jest dłuższe niż użycie średników ...?
Apollys obsługuje Monikę
76

Po prostu podaj pełną, świeżą odpowiedź:

Generalnie unikaj metod jednokreskowych. Chociaż są dość popularne w środowisku naturalnym, istnieje kilka cech charakterystycznych ich składni definicji, które sprawiają, że ich użycie jest niepożądane. W każdym razie - w metodzie jednowierszowej nie powinno być więcej niż jedno wyrażenie .

# 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

Jedynym wyjątkiem od reguły są metody z pustym treścią.

# good
def no_op; end

Z bbatsov / ruby-style-guide .

Sergey Alekseev
źródło
39
def add a,b; a+b end

Średnik to terminator instrukcji wbudowanej dla Rubiego

Lub możesz użyć define_methodmetody. (Edycja: ten jest przestarzały w Ruby 1.9)

define_method(:add) {|a,b| a+b }
edgerunner
źródło
4
Wydaje się, że nie jest przestarzały w Ruby 2+
michau,
9

Inny sposób:

define_method(:greet) { puts 'hello' }

Może być użyty, jeśli nie chcesz wprowadzać nowego zakresu dla metody podczas jej definiowania.

Victor Deryagin
źródło
NoMethodError: metoda prywatna `define_method 'wywołana dla Object: Class w Ruby 1.9.3
Jared,
3
define_methodzostał "sprywatyzowany" w Ruby 1.9
edgerunner
8

Jeszcze inny sposób:

def greet() return 'Hello' end
Josh D.
źródło
13
W Rubim wartość zwracana przez metodę jest wartością zwracaną przez ostatnią instrukcję. Nie potrzebujesz returntutaj, ponieważ nie jest to klauzula ochronna.
Damien
1
Uznano za pozytywnymi, ponieważ chociaż nie jest to potrzebne , returnmoże zwiększyć czytelność dla osób mniej obeznanych (lub zaznajomionych z) Rubim. To jedna z tych rzeczy z YMMV ...
Potherca,