Як визначити метод на одному рядку в Ruby?


92

Чи def greet; puts "hello"; endєдиний спосіб визначити метод на одному рядку в Ruby?


11
Як видно з відповідей, можна визначити метод різними способами в одному рядку, але питання в тому, чи слід вам? Будь-яке визначення повинно бути написане таким чином, щоб воно було чітким та чистим з міркувань технічного обслуговування та читабельності, тому, якщо однорядковий рядок стає громіздким або заплутаним, розподіліть його. Деякі мови, схоже, заохочують стисле кодування як спосіб вивчення коду, однак стиль кодування Ruby заохочує елегантність, читабельність та ремонтопридатність вище вивченості. Виконайте перші три, і ми вклонимось вам.
Олов'яна людина

Відповіді:


102

Ви можете уникнути необхідності використовувати крапки з комою, якщо використовуєте дужки:

def hello() :hello end

1
Це довше, ніж використання крапки з комою ...?
Apollys підтримує Моніку

73

Просто дайте повну свіжу відповідь:

Як правило, уникайте однорядкових методів. Хоча вони дещо популярні в дикій природі, існує кілька особливостей синтаксису їх визначення, які роблять їх використання небажаним. У будь-якому випадку - в однорядковому методі не повинно бути більше одного виразу .

# 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 in Ruby 1.9.3
Джаред

3
define_methodбув "приватизований" в Ruby 1.9
edgerunner

8

Ще один спосіб:

def greet() return 'Hello' end

12
У Ruby повернене значення методу - це значення, яке повертається останнім оператором. Тут вам не потрібно, returnоскільки це не охоронне застереження.
Демієн,

1
Проголосував за те, що, хоча він і не потрібен , він returnможе додати читабельності для тих, хто менш обізнаний у (або знайомий з) Ruby. Це одна з тих речей YMMV ...
Potherca
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.