Comment définir une méthode sur une ligne dans Ruby?

92

Est-ce def greet; puts "hello"; endle seul moyen de définir une méthode sur une seule ligne dans Ruby?

RyanScottLewis
la source
11
Comme vous pouvez le voir dans les réponses, il est possible de définir une méthode de différentes manières sur une seule ligne, mais la question est, devriez-vous? Toute définition doit être rédigée de manière claire et nette pour des raisons de maintenance et de lisibilité, donc si la ligne unique devient lourde ou déroutante, étalez-la. Certains langages semblent encourager le codage laconique comme un moyen d'être à l'écoute du code, mais le style de codage Ruby encourage l'élégance, la lisibilité et la maintenabilité au-dessus de la rigueur. Accomplissez les trois premiers et nous nous inclinerons devant vous.
the Tin Man

Réponses:

102

Vous pouvez éviter d'utiliser des points-virgules si vous utilisez des parenthèses:

def hello() :hello end
horseyguy
la source
1
C'est plus long que d'utiliser des points-virgules ...?
Apollys soutient Monica le
73

Donnez simplement la nouvelle réponse complète:

En général, évitez les méthodes monolignes. Bien qu'ils soient assez populaires dans la nature, il existe quelques particularités dans leur syntaxe de définition qui rendent leur utilisation indésirable. En tout cas, il ne devrait pas y avoir plus d'une expression dans une méthode sur une seule ligne .

# 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

Les méthodes à corps vide constituent une exception à la règle.

# good
def no_op; end

De bbatsov / ruby-style-guide .

Sergey Alekseev
la source
39
def add a,b; a+b end

Le point-virgule est le terminateur d'instruction en ligne pour Ruby

Ou vous pouvez utiliser la define_methodméthode. (Edit: celui-ci est obsolète dans ruby ​​1.9)

define_method(:add) {|a,b| a+b }
coupe-bordures
la source
4
Ne semble pas être obsolète dans Ruby 2+
michau
9

Autrement:

define_method(:greet) { puts 'hello' }

Peut être utilisé si vous ne souhaitez pas entrer de nouvelle portée pour la méthode lors de sa définition.

Victor Deryagin
la source
NoMethodError: méthode privée `define_method 'appelée pour Object: Class in Ruby 1.9.3
Jared
3
define_methoda été "privatisé" dans Ruby 1.9
edgerunner
8

Encore une autre façon:

def greet() return 'Hello' end
Josh D
la source
12
Dans Ruby, la valeur de retour d'une méthode est la valeur renvoyée par la dernière instruction. Vous n'avez pas besoin de l' returnici car ce n'est pas une clause de garde.
Damien
1
Voté parce que, bien que cela ne soit pas nécessaire , le returnpeut ajouter de la lisibilité pour les moins versés (ou familiers avec) Ruby. C'est une de ces choses YMMV ...
Potherca