Kotlin. Функції. Область видимості функції

Функції. Область видимості функції. Локальна область видимості. Аргументи за замовчуванням в параметрах функції

Дана тема є продовженням теми:


Зміст


Пошук на інших ресурсах:

1. Поняття області видимості функції. Локальні змінні. Змінні рівня файлу (глобальні змінні)

Кожна оголошена в програмі функція має свою власну область видимості. Ця область обмежується фігурними дужками { }, які визначають тіло функції. У тілі функції можуть використовуватись різні імена, що є іменами параметрів, змінних, констант чи інших функцій. Виходячи з цього контексту, у функції компілятор розрізняє два види імен змінних (констант):

  • імена рівня файлу (глобальні змінні, константи). Це можуть бути, наприклад, імена констант, оголошених за межами функції. Більш детально про використання констант у програмі можна прочитати тут. Змінні рівня файлу повинні бути ініціалізовані одразу після їх оголошення. Ці змінні видимі в будь-якому місці проекту та існують поки не завершиться виконання всієї програми;
  • локальні імена. Такі імена є іменами локальних змінних, що оголошені в тілі функції. Стосовно локальної змінної використовують термін час життя змінної. Якщо в тілі функції оголошено змінну, то ця змінна має час життя від моменту оголошення до закриваючої дужки }.

Нижче наведено приклад, що пояснює область видимості локальної змінної.

// Область видимості функції
fun MyFun() { // Тіло функції.

  // Тут оголошуються локальні змінні
  var x : Double // оголошення локальної змінної x

  // використання локальної змінної x
  x = 2.85

  // ...

} // закінчення існування локальної змінної x

У вищенаведеному коді змінна x є локальною. Час життя змінної x триває від моменту оголошення до закриваючої дужки функції. За межами тіла функції змінна x припиняє своє існування.

  

2. Приклад, що демонструє використання у тілі функції змінних рівня файлу та локальних змінних

У прикладі оголошується функція VolumeSphere(), яка повертає об’єм кулі на основі її радіусу. У функції використовуються:

  • змінна рівня файлу – константа Pi;
  • локальна змінна volume, яка використовується для зберігання результату обчислення.

Також у функції використовується параметр radius, який має таку ж область видимості як локальна змінна volume.

// Змінна рівня файлу
const val Pi = 3.1415

// Функція, що обчислює об'єм кулі на основі радіусу
fun VolumeSphere(radius : Double):Double {
  val volume : Double // локальна змінна
  volume = 4.0/3*Pi*radius*radius*radius
  return volume
}

fun main(args:Array<String>)
{
  // Використання функції VolumeSphere()

  // 1. Оголосити змінні
  val r : Double
  val result : Double

  // 2. Ввести радіус
  print("radius = ")
  r = readLine().toString().toDouble()

  // 3. Викликати функцію
  result = VolumeSphere(r)

  // 4. Вивести результат
  print("result = " + result)
}

Тестовий приклад

radius = 3.5
result = 179.58908333333332

  

3. Аргументи за замовчуванням. Особливості застосування

Бувають випадки, коли при оголошенні функції один або декілька параметрів повинні отримувати деякі початкові, найбільш вживані, значення. При виклику функції ці початкові значення можуть бути змінені на інші в залежності від потреби.

Отже, значення за замовчуванням, що встановлюються для параметрів функції при її оголошенні, називаються аргументами за замовчуванням.

Загальна форма оголошення функції, що містить один параметр, який отримує аргумент за замовчуванням, наступна

fun FuncName(paramName : Type = value) : Type {
  // ...
}

тут

  • FuncName – ім’я функції;
  • paramName – ім’я параметра;
  • Type – тип параметра;
  • value – значення за замовчуванням, яке отримує параметр paramName.

Після такого оголошення, функція може викликатись двома способами. Перший спосіб – це виклик з явним задаванням аргументу

FuncName(argument)

Другий спосіб – виклик без аргументу

FuncName()

При цьому способі, замість аргументу, в тілі функції підставляється значення value, яке вказано в параметрі paramName при оголошенні функції

paramName : Type = value

Загальна форма оголошення функції, яка отримує N аргументів за замовчуванням має вигляд

fun FuncName(paramName1 : Type1 = value1,
             paramName2 : Type2 = value2,
             ...
             paramNameN : TypeN = valueN,
            ) : Type {
  // ...
}

тут

  • paramName1, paramName2, paramNameN – імена параметрів, які мають відповідно типи Type1, Type2, TypeN та отримують відповідно значення value1, value2, valueN.

  

4. Обмеження на застосування аргументів за замовчуванням

При оголошенні функцій з декількома аргументами за замовчуванням, потрібно дотримуватись наступного правила: першими слідують параметри, що не отримують значень за замовчуванням, після цього слідують параметри, що отримують значення за замовчуванням. Річ у тому, що компілятор в будь-якому випадку передає перший переданий аргумент першому параметру. А це означає, що другий, чи інший наступний параметр не буде отримувати ніякого значення, що буде призводити до помилки на етапі компіляції.

Наприклад.

Нехай задано наступне помилкове оголошення функції

fun MyFun(param1 : Int = 2, param2 : Double) {
  println(param1)
  println(param2)
}

У цьому випадку виклик функції MyFun() обмежений

...

MyFun(3, 2.2) // Працює, обидва параметри приймають значення.
MyFun()  // Помилка. Потрібно задати param2.
MyFun(2) // Помилка. Задається значення param1. Значення param2 невизначене.

...

  

5. Приклади оголошення та використання функцій, що містять аргументи за замовчуванням
5.1. Обчислення відстані між двома точками

Задача. Розробити та продемонструвати роботу функції, яка обчислює відстань між двома точками, які задані координатами (x1; y1) та (x2; y2). При оголошенні функції задати наступні значення точок за замовчуванням

x1 = 0
y1 = 0
x2 = 1
y2 = 1

Розв’язок.

// Функція, що обчислює відстань між двома точками,
// заданими координатами (x1; y1), (x2; y2).
fun Length(x1 : Double = 0.0, y1 : Double = 0.0,
    x2 : Double = 1.0, y2 : Double = 1.0) : Double {
  return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
}

fun main(args:Array<String>)
{
  // Демонстрація використання функції Length()

  // Обчислити довжину для точок (0, 0), (1, 1)
  println("(0,0)-(1,1) = " + Length())

  // Обчислити довжину для точок (0, 0), (2, 2)
  println("(0,0)-(2,2) = " + Length(0.0, 0.0, 2.0, 2.0))

  // Обчислити довжину для точок (3, 4), (1, 1)
  println("(3,4)-(1,1) = " + Length(3.0, 4.0))

  // Обчислити довжину для точок (2, 0), (1, 1)
  println("(2,0)-(1,1) = " + Length(2.0))
}

Результат виконання програми

(0,0)-(1,1) = 1.4142135623730951
(0,0)-(2,2) = 2.8284271247461903
(3,4)-(1,1) = 3.605551275463989
(2,0)-(1,1) = 1.4142135623730951

  

5.2. Модуль комплексного числа

Задача. Реалізувати функцію AbsComplex(), яка отримує параметрами дійсну та уявну частини комплексного числа. Параметри функції отримують одиничні значення за замовчуваннями.

Розв’язок.

// Функція, що обчислює модуль комплексного числа
fun AbsComplex(re:Double = 1.0, im:Double = 1.0) : Double {
  return Math.sqrt(re*re+im*im)
}

fun main(args:Array<String>)
{
  // Демонстрація використання функції AbsComplex()

  // Обчислити модуль комплексного числа 1 + 1*j
  println("|1 + j| = " + AbsComplex())

  // Модуль числа 3 - 2*j
  println("|3 - 2*j| = " + AbsComplex(3.0,-2.0))

  // Модуль числа 2 + j
  println("|2 + 1*j| = " + AbsComplex(2.0))

  // Модуль числа 1 + 2*j
  println("|1 + 2*j| = " + AbsComplex(1.0, 2.0))
}

Результат виконання програми

|1 + j| = 1.4142135623730951
|3 - 2*j| = 3.605551275463989
|2 + 1*j| = 2.23606797749979
|1 + 2*j| = 2.23606797749979

  


Споріднені теми