Ruby программирование с нуля

Ruby за двадцать минут

Что если мы хотим сказать “Hello” без утомления наших пальцев? Мы должны создать метод!

irb(main):010:0> def h irb(main):011:1> puts "Hello World!" irb(main):012:1> end => nil

Код def h означает начало объявление метода. Он говорит Ruby, что мы определяем метод, имя которого h . Следующая строка – тело метода, та же строка, что мы видели раньше: puts «Hello World» . И, наконец, последняя строка, end , говорит Ruby, что мы завершили объявление метода. Ответ от Ruby, => nil , говорит нам, что он понял, что мы завершили объявление метода.

Кратко о повторяющихся жизнях метода

Теперь давайте попробуем вызвать метод несколько раз:

irb(main):013:0> h Hello World! => nil irb(main):014:0> h() Hello World! => nil

Ну, это было просто. Вызвать метод в Ruby так же просто, как просто упомянуть его имя в коде. Если метод не принимает параметры – это все что вам нужно сделать. Вы можете добавить пустые скобки, если вам так нравится, но это не обязательно.

Что если мы хотим сказать hello одному человеку, а не всему миру? Просто переопределим метод h , чтобы он принимал имя как параметр.

irb(main):015:0> def h(name) irb(main):016:1> puts "Hello #name>!" irb(main):017:1> end => nil irb(main):018:0> h("Matz") Hello Matz! => nil

Итак, это работает… но давайте на секунду задумаемся, что здесь происходит.

Места для интерполяции в String

Что такое # в коде выше? Это способ Ruby вставить что-либо в строку. Кусок кода между фигурными скобками превратится в строку (если это еще не строка) и потом подставится во внешнюю строку в этом месте. Вы также можете использовать это, чтобы убедиться, что имя будет с большой буквы:

irb(main):019:0> def h(name = "World") irb(main):020:1> puts "Hello #name.capitalize>!" irb(main):021:1> end => nil irb(main):022:0> h "chris" Hello Chris! => nil irb(main):023:0> h Hello World! => nil

Вы должны здесь отметить несколько других приемов. Один из них, что мы опять вызываем метод без скобок. Если очевидно то, что вы хотите сделать – скобки не обязательны. Другой прием – это параметр по умолчанию World . Это означает что, “Если имя не передано в качестве параметра, используй параметр по умолчанию World ”.

Эволюционируем в Greeter (Приветствующего)

Что если мы хотим создать реального приветствующего, того кто запомнит ваше имя и поприветствует вас и всегда будет относиться к вам с уважением? Вы можете использовать для этого объект. Давайте создадим класс “Greeter”.

irb(main):024:0> class Greeter irb(main):025:1> def initialize(name = "World") irb(main):026:2> @name = name irb(main):027:2> end irb(main):028:1> def say_hi irb(main):029:2> puts "Hi #@name>!" irb(main):030:2> end irb(main):031:1> def say_bye irb(main):032:2> puts "Bye #@name>, come back soon." irb(main):033:2> end irb(main):034:1> end => nil

Новое ключевое слово здесь — class . Оно служит для объявления нового класса, который мы назвали Greeter и несколько методов для этого класса. Также заметьте @name . Это переменная объекта и она доступна для всех методов в классе. Как вы можете видеть, она используется методами say_hi и say_bye .

Итак, как мы сможем заставить этот класс Greeter работать? Создадим объект.

Начните сейчас, это легко!

Источник

Ruby за двадцать минут

Итак, приглядимся повнимательнее к нашей новой программе. Обратите внимание на первые строки, начинающиеся с хэш символа (#). В Ruby все, что в одной строке идет после хэш символа является комментарием и игнорируется интерпретатором. Первая строка файла – особый случай, и под Unix-подобными операционными системами говорит шеллу (shell) как запускать данный файл. Остальные комментарии служат лишь для пояснений кода.

Наш say_hi метод стал немного более сложным:

# Сказать всем привет def say_hi if @names.nil? puts ". " elsif @names.respond_to?("each") # @names это некий список, итерируй! @names.each do |name| puts "Hello #name>!" end else puts "Hello #@names>!" end end

Теперь он смотрит на переменную @names , чтобы принять решение. Если ее значение nil, он просто печатает три точки. Нет смысла приветствовать несуществующее, верно?

Циклы и повторы – так же известные как итерации

Если объект, записанный в переменной @names откликается на метод each , значит он является объектом на котором вы можете итерировать. И итерируя по нему вы можете приветствовать каждого человека за раз. И наконец, если @names является чем-то совсем другим, просто превратим ее в строку автоматически и поприветствуем.

Давайте взглянем на итератор повнимательнее:

@names.each do |name| puts "Hello #name>!" end

each – это метод, который принимает блок кода и запускает этот блок кода для каждого элемента в списке. И в примере выше, код между do и end , это просто некий блок. Блок это что-то вроде анонимной функции или лямбды . Переменная между знаками (|) – это параметр для данного блока, как раз тот самый элемент списка, на которым будет производится действие в блоке кода.

Что происходит здесь, это то, что каждая запись в списке, name , привязана к элементу в списке, и таким образом выражение puts «Hello #!» будет выполнено с этим элементом.

Большинство других языков программирования поддерживают прохождение по списку при помощи цикла for , который в C выглядит примерно так:

for (i=0; inumber_of_elements; i++)  do_something_with(element[i]); >

Это работает, но это не так элегантно. Вам нужно заводить переменную типа i , понимать, сколько элементов в списке, и объяснять языку, как он должен проходить по списку. Путь Ruby намного элегантней, все детали исполнения скрыты внутри each метода, и все что вам нужно сделать – это сказать, что нужно сделать с элементами списка. Внутри метод each вызывает yield «Albert'», затем yield “Brenda”` и так далее с остальными именами.

Блоки, прекрасные блестки на грани Ruby

Реальная сила блоков видна, когда вы работаете с более сложными сущностями, чем списки. За выполнением простых деталей внутри метода, вы также можете осуществлять там некую настройку, декомпозицию, отлавливать ошибки – все может быть скрыто от пользователя.

# Сказать всем пока def say_bye if @names.nil? puts ". " elsif @names.respond_to?("join") # Объединить все значения из списка через запятую puts "Goodbye #@names.join(", ")>. Come back soon!" else puts "Goodbye #@names>. Come back soon!" end end

Метод say_bye не использует each , вместо этого он проверяет, что @names откликается на метод join , и если так, использует его. В другом случае, он просто печатает переменную в виде строки. Этот метод не волнует настоящий тип переменной, просто действует в зависимости от методов, которые тот поддерживает. Это так же известно под названием “Duck Typing” (Утиная типизация), как в известной фразе – ”если оно ходит как утка, если оно крякает как утка – это утка”. Выигрыш от этого в том, что вам не обязательно ограничивать типы переменных, которые поддерживаются. Если кто-то захочет использовать ваш метод с неким новым классом списка, пока тот поддерживает вызов метода join с аналогичной другим спискам семантикой – все будет работать как запланировано.

Запускаем скрипт

Итак, это был MegaGreeter класс, остальное в файле, это лишь вызовы метода на этом классе. Последний трюк, на который стоит обратить внимание, это следующая строка:

__FILE__ – это магическая переменная, которая содержит имя текущего файла. $0 – это имя файла, которое было использовано при запуске программы. Данная проверка говорит: “Если это тот самый файл, который был запущен изначально…”. Это позволяет файлу быть использованным как библиотека, и не выполнять код в данном контексте. Но если файл используется как выполняемый – тогда выполняем этот код.

Считайте, что вы в теме

Итак, это конец краткого тура по Ruby. Там еще столько для изучения, различные структуры, которые предлагает Ruby; использование блоков и yield ; модули и примеси; и многое-многое другое. Я надеюсь, что эти небольшие примеры оставят в вас приятное послевкусие от Ruby и вы захотите узнать его еще лучше!

Если так, пожалуйста просмотрите нашу Документацию, которая содержит в себе ссылки на руководства и введения, все они бесплатно доступны онлайн.

Начните сейчас, это легко!

Исследуйте новый мир…

Вступайте в дружелюбное и развивающееся сообщество.

  • Почтовые рассылки: Разговоры о Ruby в кругу программистов со всего мира.
  • Группы пользователей: Познакомьтесь с рубистами рядом с вами.
  • Блоги: Читайте о том, что происходит в сообществе Ruby прямо сейчас.
  • Ядро Ruby: Помощь в полировке последней версии Ruby.
  • Решение проблем: Сообщайте или помогайте решать проблемы в Ruby.

Источник

Читайте также:  Программирование станков чпу siemens
Оцените статью