# Методы

Метод в Ruby - это блок кода, который имеет имя и может быть вызван из другого блока кода. Метод определяется с помощью ключевого слова `def`, за которым следует имя метода и его параметры, если они нужны. Внутри блока кода метода можно использовать различные операторы, условия, циклы, переменные и тд. Методы в Ruby имеют значение, которое возвращается с помощью **последней** строки кода внутри иметода - что вернется в последней строчке, то и будет результатом метода. Кроме того, вернуть значение можно с помощью ключевого слова return, если нужно выйти из метода заранее.

Давайте разберем примеры:

```ruby
# Пример метода без параметров
def hello_world
  # последней строкой является `puts`, который ничего не возвращает
  # значит и наш метод не возвращает значения
  puts "Hello, world!"
end

# вызов метода
hello_world

# пример метода с параметрами (аргументами)
def sum(first, second)
    # результат последней строки кода будет сумма чисел
    first + second
end

puts sum(10, 20) # = 30. значит результатом метода будет сумма 10 и 20

# Пример метода с переменным числом аргументов
def sum(*numbers)
  result = 0
  for number in numbers
    result += num
  end
  # последняя строка - результат метода
  result
end

puts sum(1, 2, 3, 4, 5) # = 15. вызываем метод и выводим результат
```

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

```ruby
# Метод для расчета суммы двух чисел
def sum(a, b)
  return a + b
end

# Вводим числа для сложения
puts "Введите число А:"
num_a = gets.chomp.to_i

puts "Введите число B:"
num_b = gets.chomp.to_i

# Рассчитываем и выводим сумму
s1 = sum(num_a, num_b)
puts "Сумма чисел равна: #{s1}"

# Вводим еще одно число для сложения
puts "Введите число C:"
num_c = gets.chomp.to_i

# Рассчитываем и выводим общую сумму трех чисел
s2 = sum(s1, num_c)
puts "Общая сумма равна: #{s2}"
```

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

```ruby
# Метод для конвертации числа из десятичной системы счисления в бинарную
def decimal_to_binary(decimal)
  binary = ""
  while decimal > 0
    binary = (decimal % 2).to_s + binary
    decimal = decimal / 2
  end
  binary
end

# Метод для проверки, является ли слово палиндромом
def palindrome?(word)
  word.downcase == word.downcase.reverse
end

# Использование методов для работы с числами и строками
number = 137
puts "Число #{number} в бинарном виде: #{decimal_to_binary(number)}"

word = "шалаш"
puts "Слово '#{word}' является палиндромом: #{palindrome?(word)}"
```

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

**Важно:** Так как Ruby выполняет код построчно сверху-вниз, то если объявить метод после его использования в программе, то можно получить ошибку. Тоже самое и с переменнными, которые используются внутри метода. Если переменная объявлена после объявления метода, который использует эту переменную, то можно увидеть ошибку, что программа не знает о существовании такой переменной

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

Также мы можем давать аргументам в методах значение по умолчанию.

```ruby
def method_name(parameter_one = "default value one", parameter_two = "default value two")
  puts "param one - #{parameter_one}, param two - #{parameter_two}"
end
```

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

```ruby
method_name() # param one - default value one, param two - default value two

method_name("new param one") # param one - new param one, param two - default value two
```

## Именные параметры

Кроме того мы можешь делать значения по умолчанию с помощью двоеточия `:`. В отличии от знака равенства мы можем передавать аргументы в метод по их названию

```ruby
def method_name(parameter_one: "default value one", parameter_two: "default value two")
  puts "param one - #{parameter_one}, param two - #{parameter_two}"
end

method_name(parameter_two: "new param two") # param one - default value one, param two - new param two
```

## Задание income\_calculator

есть программа:

```ruby
MIN_INCOME = 200_000
MAX_INCOME = 900_000

OFFICE_RENT_CHARGE = 140_000
TELEPHONY_CHARGE = 12_000
INTERNET_ACCESS_CHARGE = 7200

ASSISTANT_SALARY = 45_000
FINANCE_MANAGER_SALARY = 90_000

MAIN_TAX_PERCENT = 0.24
MANAGER_PERCENT = 0.15

MIN_INVESTMENTS_AMOUNT = 100_000

loop do
  puts "Введите сумму доходов компании за месяц (от 200 до 900 тысяч рублей): "
  income = gets.to_i
  next unless check_income_range(income)

  manager_salary = income * MANAGER_PERCENT
  pure_income = income - manager_salary - calculate_fixed_charges
  tax_amount = MAIN_TAX_PERCENT * pure_income
  pure_income_after_tax = pure_income - tax_amount
  can_make_investments = pure_income_after_tax >= MIN_INVESTMENTS_AMOUNT
  puts "Зарплата менеджера: #{manager_salary}"
  puts "Общая сумма налогов: #{tax_amount.positive? ? tax_amount : 0}"
  puts "Компания может инвестировать: #{can_make_investments ? 'да' : 'нет'}"
  puts "Бюджет в минусе! Нужно срочно зарабатывать!" if pure_income.negative?
end 

def calculate_fixed_charges
  OFFICE_RENT_CHARGE +
  TELEPHONY_CHARGE +
  INTERNET_ACCESS_CHARGE +
  ASSISTANT_SALARY +
  FINANCE_MANAGER_SALARY
end

def check_income_range(income)
  if income < MIN_INCOME
    puts "Доход меньше нижней границы"
    false
  elsif income > MAX_INCOME
    puts "Доход выше верхней границы"
    false
  else
    true
  end
end
```

* Прочтите код, попытайтесь понять, что он делает.&#x20;
* Запустите код и посмотрите на выдачу. Прочтите ошибку, попытайтесь понять, что она означает.
* Исправьте ошибку&#x20;
* Запустите еще раз код, убедитесь, что программа работает корректно.
* Опишите общее назначение программы.
* Напишите к каждой строчке кода комментарий о том, что выполняется в данной строке.
* напишите метод для расчета минимальной сумму дохода `calculate_min_income_for_investments`, при вводе которой программа ответит, что инвестировать можно.
* Вызовете этот метод до получения пользовательского ввода, чтобы пользователь заранее знал с каким доходом он сможет инвестировать

Рекомендации:

* Примените существующие выражения в программе и выведите обратную формулу, удовлетворяющую условию инвестирования.
* Задачу можно решить с помощью циклов или с помощью математического уровнения путем упрощения множителей. Ваша задача решить задачу, а не сделать это самым эффективным способом, поэтому оба решения будут считаться верным.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://evgenii-afanasev.gitbook.io/ruby-course/2_basics/4_methods.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
