Как мне определить метод в одной строке в Ruby?

92

Это def greet; puts "hello"; endединственный способ определить метод в одной строке в Ruby?

РайанСкоттЛьюис
источник
11
Как видно из ответов, можно определить метод разными способами в одной строке, но вопрос в том, должны ли вы? Любое определение должно быть написано ясным и понятным способом из соображений обслуживания и удобочитаемости, поэтому, если однострочная строка становится громоздкой или запутанной, разложите ее. Некоторые языки, кажется, поощряют лаконичное кодирование как способ быть тщательно продуманным, но стиль кодирования Ruby поощряет элегантность, удобочитаемость и ремонтопригодность выше усердия. Выполните первые три и мы вам поклонимся.
Железный Человек

Ответы:

104

Вы можете избежать необходимости использовать точку с запятой, если будете использовать круглые скобки:

def hello() :hello end
конь
источник
1
Это больше, чем при использовании точки с запятой ...?
Apollys поддерживает Монику
76

Просто дайте полный свежий ответ:

В общем, избегайте однострочных методов. Хотя они довольно популярны в дикой природе, в их синтаксисе определения есть несколько особенностей, которые делают их использование нежелательным. Во всяком случае - в однострочном методе должно быть не более одного выражения .

# 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

Единственным исключением из правила являются методы с пустым телом.

# good
def no_op; end

Из bbatsov / ruby-style-guide .

Сергей Алексеев
источник
39
def add a,b; a+b end

Точка с запятой - это встроенный терминатор оператора для Ruby.

Или вы можете использовать define_methodметод. (Изменить: это устарело в Ruby 1.9)

define_method(:add) {|a,b| a+b }
edgerunner
источник
4
Кажется, не устарел в Ruby 2+
michau
9

По-другому:

define_method(:greet) { puts 'hello' }

Может использоваться, если вы не хотите вводить новую область действия для метода при его определении.

Виктор Дерягин
источник
NoMethodError: закрытый метод `define_method 'вызван для Object: Class в Ruby 1.9.3
Джаред
3
define_methodбыл «приватизирован» в Ruby 1.9
edgerunner 01
8

Еще один способ:

def greet() return 'Hello' end
Джош Д.
источник
13
В Ruby возвращаемое значение метода - это значение, возвращаемое последним оператором. Здесь вам не нужно, returnтак как это не оговорка о защите.
Дэмиен
1
Проголосовали, потому что, хотя это и не нужно , он returnможет добавить удобочитаемость для тех, кто менее разбирается в Ruby (или знаком с ним). Это одна из тех вещей YMMV ...
Potherca