Menu
Coddy logo textTech

Работа с файлами

Часть раздела Объектно-ориентированное программирование путешествия по Ruby на Coddy. Урок 1 из 57.

Настоящие программы разделены на несколько файлов. Файл Ruby загружает другой файл с помощью require_relative, после чего указывается путь к файлу относительно текущего файла, обычно без окончания .rb. После этой строки можно использовать методы и классы загруженного файла:

# greeting.rb
def greeting(name)
  "Hello, #{name}!"
end

# main.rb
require_relative 'greeting'
puts greeting("Ada")

Запуск ruby main.rb выводит Hello, Ada!: main.rb загружает greeting.rb, а затем вызывает его метод.

Программа начинается в файле, который вы запускаете, — здесь это main.rb, и Ruby выполняет его сверху вниз. require_relative запускает другой файл в этом месте и только при первом обращении: второй вызов require_relative 'greeting' возвращает false и ничего не делает. Имя можно использовать только после загрузки файла, в котором оно определено:

# main.rb
# puts greeting("Bo")          # NoMethodError: greeting.rb ещё не загружен
require_relative 'greeting'     # запускает greeting.rb, возвращает true
require_relative 'greeting'     # уже загружен, возвращает false
puts greeting("Bo")

Обычно в каждом файле находится один класс, а имя файла соответствует имени класса в snake_case: class Dog находится в dog.rb, а class BankAccount — в bank_account.rb. В заданиях этого раздела в main.rb находится предоставленный код ввода/вывода, а в начале файла размещается по одной строке require_relative для каждого файла в порядке загрузки: сначала загружается класс, на основе которого строится другой класс.

dog.rb            # class Dog ... end
bank_account.rb   # class BankAccount ... end
functions.rb      # вспомогательные методы
main.rb           # строки require_relative, затем код ввода/вывода

То, чем файл делится, зависит от типа имени. Методы, определённые с помощью def в начале файла, классы и константы могут использоваться каждым файлом, загруженным после него. Локальная переменная принадлежит только своему файлу:

# settings.rb
limit = 3                  # локальная переменная: её видит только settings.rb
MAX_ITEMS = 3              # константа: видна после загрузки
def limit_text
  "at most #{MAX_ITEMS}"
end

# main.rb
require_relative 'settings'
puts limit_text            # не более 3
puts MAX_ITEMS             # 3
# puts limit               # NameError: undefined local variable
challenge icon

Задание

Легко

Программа состоит из двух файлов. main.rb загружает greeting.rb, считывает имена и выводит результат работы greeting(name). Дополните greeting в greeting.rb, чтобы для имени Ada она возвращала Hello, Ada!, а при пустом имени — Hello, friend!.

Ваш код должен находиться в greeting.rb. В main.rb содержится предоставленный код ввода/вывода, и его нельзя редактировать.

Попробуйте сами

require_relative 'greeting'

# Предоставленный код ввода/вывода: оставьте его как есть
input = []
while (line = gets)
  input << line.chomp
end
input.each { |name| puts greeting(name) }
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Ruby