Как мне определить метод в одной строке в 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 }

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.