Архив метки: методы

Главная / методы
1 Пост

В этом посте мы рассмотрим:

  • Функции/методы
    • Определения
    • Как их называть?
    • Что и как они возвращают?
    • Аргументы по умолчанию
  • Как сделать методы более выразительными
  • Что такое «splat»

Функции и методы

Технически, функция определяется за пределами класса, а метод определяется внутри класса.

В Ruby, каждый метод/функция имеет как минимум один класс, к которому он пренадлежит.

  • Не всегда записан внутри класса

Таким образом, каждая функция на самом деле является методом в Ruby.

Методы

Методы могут иметь скобки, но они полностью опциональны как при определении метода, так и при вызове метода.

Скобки используются для ясности, хотя это и не необходимо.


def simple
  puts "без скобок"
end

def simple1()
  puts "со скобками"
end

simple() # => без скобок
simple # => без скобок
simple1 # => со скобками

В этом примере мы определили метод simple без скобок, но мы его можем вызвать как со скобками, так и без, — и это полностью разрешено. То же самое относится и к методу simple1.

Возврат

  • Нет необходимости объявлять тип параметров
  • Может возвращать всё, что вы хотите
  • Ключевое слово return опционально (возвращается последняя выполненная строка)

def add(one, two)
 one + two
end

def divide(one, two)
  return "Я так не думаю" if two == 0
  one / two
end

puts add(2,2) # => 4
puts divide(2,0) # => Я так не думаю
puts divide(12, 4) # => 3

Выразительные имена методов

Имена методов могут оканчиваться на:

  • ? — основанные на чем-то методы (как правило, возвращает логическое значение)
  • ! — может иметь опасные побочные эффекты

def can_divide_by?(number)
  return false if number.zero?
  true
end

puts can_divide_by? 3 # => true
puts can_divide_by? 0 # => false

Аргументы по умолчанию

Методы могут иметь аргументы по умолчанию.

  • Если внесено значение — используется данное значение
  • В другом случае — используется значение по умолчанию

def factorial (n)
  n ==? 1 : n * factorial(n - 1)
end

def factorial_with_default (n = 5)
  n ==0? 1 : n * factorial_with_default(n - 1)
end

puts factorial 5 # => 120
puts factorial_with_default # => 120
puts factorial_with_default(3) # => 6

Splat

Splat — это интересная концепция.

* идет перед параметром в определении метода

  • Может применяться даже к параметру посередине, а не только последнему

Он почти похож на указатель, как указатель в C, но это не так. Это похоже на var args, переменные аргументы в Java.

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

И интересная часть заключается в том, что он может относиться к среднему параметру, а не только к последнему параметру метода.


def max(one_param, *numbers, another)
  numbers.max
end

puts max("что-то", 6, 31, -5, "еще") # => 31