Menu
CoddyTech

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

Часть раздела Объектно-ориентированное программирование путешествия по 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: неопределённая локальная переменная
challenge icon

Задание

Легко

В программе два файла. main.rb загружает greeting.rb, считывает имена и выводит результат greeting(name). Дополните greeting в greeting.rb, чтобы она возвращала Hello, Ada! для имени 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