Wie definiere ich eine Methode in einer Zeile in Ruby?

91

Ist def greet; puts "hello"; enddie einzige Möglichkeit, eine Methode in Ruby in einer Zeile zu definieren?

RyanScottLewis
quelle
11
Wie Sie den Antworten entnehmen können, ist es möglich, eine Methode auf unterschiedliche Weise in einer einzelnen Zeile zu definieren. Die Frage ist jedoch, sollten Sie? Jede Definition sollte aus Wartungs- und Lesbarkeitsgründen klar und sauber geschrieben werden. Wenn die einzelne Zeile also unhandlich oder verwirrend wird, verteilen Sie sie. Einige Sprachen scheinen eine knappe Codierung zu fördern, um Code zu lernen, aber der Ruby-Codierungsstil fördert Eleganz, Lesbarkeit und Wartbarkeit über die Studierbarkeit hinaus. Erfülle die ersten drei und wir werden uns vor dir verneigen.
der Blechmann

Antworten:

100

Sie können die Verwendung von Semikolons vermeiden, wenn Sie Klammern verwenden:

def hello() :hello end
horseyguy
quelle
1
Dies ist länger als die Verwendung von Semikolons ...?
Apollys unterstützt Monica
72

Geben Sie einfach die vollständige neue Antwort:

Vermeiden Sie im Allgemeinen einzeilige Methoden. Obwohl sie in freier Wildbahn etwas beliebt sind, gibt es einige Besonderheiten in ihrer Definitionssyntax, die ihre Verwendung unerwünscht machen. Auf jeden Fall sollte eine einzeilige Methode nicht mehr als einen Ausdruck enthalten .

# 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

Eine Ausnahme von der Regel sind Leerstellenmethoden.

# good
def no_op; end

Von bbatsov / ruby-style-guide .

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

Das Semikolon ist der Terminator für Inline-Anweisungen für Ruby

Oder Sie können die define_methodMethode verwenden. (Bearbeiten: Dieser ist in Ruby 1.9 veraltet)

define_method(:add) {|a,b| a+b }
Kantenläufer
quelle
4
Scheint
9

Ein anderer Weg:

define_method(:greet) { puts 'hello' }

Kann verwendet werden, wenn Sie beim Definieren keinen neuen Bereich für die Methode eingeben möchten.

Victor Deryagin
quelle
NoMethodError: Private Methode `define_method 'für Object: Class in Ruby 1.9.3
Jared
3
define_methodwurde in Ruby 1.9 "privatisiert"
edgerunner
8

Noch ein anderer Weg:

def greet() return 'Hello' end
Josh D.
quelle
12
In Ruby ist der Rückgabewert einer Methode der Wert, der von der letzten Anweisung zurückgegeben wurde. Sie brauchen das returnhier nicht, da es keine Schutzklausel ist.
Damien
1
Upvoted, da dies, obwohl es nicht benötigt wird , die returnLesbarkeit für diejenigen verbessern kann, die weniger mit Ruby vertraut sind (oder mit Ruby vertraut sind). Es ist eines dieser YMMV- Dinge ...
Potherca