Выбрать главу

Теперь мы можем делать интерактивные программы! Например, эта, когда вы введёте своё имя, поприветствует вас:

puts 'Приветик, ну и как Вас зовут?'

name = gets

puts 'Вас зовут ' + name + '? Какое прекрасное имя!'

puts 'Рад познакомиться с Вами, ' + name + '. :)'

Ммм-да! Я только что выполнил её – я ввёл своё имя, и вот что получилось:

Приветик, ну и как Вас зовут?

[Chris]

Вас зовут Chris

? Какое прекрасное имя!

Рад познакомиться с Вами, Chris

. : )

Хммм… похоже, когда я ввел буквы «К», «р», «и», «с» и затем нажал на Enter, gets воспринял все буквы моего имени и символ Enter! К счастью, имеется метод как раз для подобных случаев: chomp. Он убирает все символы Enter, которые «болтаются» в конце вашей строки. Давайте снова проверим эту программу, но на сей раз призовём на помощь chomp:

puts 'Приветик, ну и как Вас зовут?' name = gets.chomp

puts 'Вас зовут ' + name + '? Какое прекрасное имя!' puts 'Рад познакомиться с Вами, ' + name + '. :)'

Приветик, ну и как Вас зовут?

Chris

Вас зовут Chris? Какое прекрасное имя!

Рад познакомиться с Вами, Chris. :)

Гораздо лучше! Обратите внимание, что поскольку name указывает на gets.chomp, нам не требуется писать name. chomp; значение name уже было chomp–нуто.

• Напишите программу, которая спрашивает у человека имя, затем отчество, затем фамилию. В результате она должна поприветствовать человека, называя его полным именем.

• Напишите программу, которая спрашивает у человека его любимое число. Пусть ваша программа прибавит единицу к этому числу, а затем предложит результат в качестве большего и лучшего любимого числа. (Однако будьте при этом тактичными.)

После того, как вы закончите эти две программы (и любые другие, которые вы пожелаете попробовать), давайте изучим ещё несколько методов (и узнаем о них ещё что-нибудь).

5. Ещё немного о методах

Пока что мы видели несколько различных методов: puts и gets и так далее (Быстрый тест: Перечислите все методы, которые мы узнали до сих пор! Их десять; ответ приводится ниже.), но мы совсем не говорили о том, что из себя представляют методы. Мы знаем, что они делают, но мы не знаем, «что они такое».

И вот что они есть на самом деле: нечто, которое выполняет что-либо. Если объекты (такие как строки, целые и плавающие числа) являются существительными в языке Ruby, то методы подобны глаголам. И совсем также, как в английском [и в русском – Прим. перев.] языке, вы не используете глагол без существительного, чтобы выполнить действие, обозначаемое глаголом. Например, тиканье не совершается само по себе; настенные часы (или наручные или что-нибудь ещё) должны производить его. На естественном языке мы бы сказали: «Часы тикают.» На Ruby мы бы сказали clock.tick (естественно, предполагая, что clock – это объект Ruby). Программисты могли бы сказать, что мы «вызвали метод tick объекта clock» или что мы «вызвали tick у clock».

Ну что, вы выполнили тест? Хорошо. Что ж, я уверен, что вы вспомнили методы puts, gets и chomp, так как мы только что разобрали их. Вы, возможно, также усвоили наши методы преобразования: to_i, to_f и to_s. Однако, знаете ли вы остальные четыре? Ну конечно же, это не что иное, как старые добрые арифметические действия: +, -, * и / !

Как я уже говорил ранее, также как каждому глаголу нужно существительное, так и каждому методу требуется объект. Обычно легко сказать, какой объект выполняет метод: тот, что стоит непосредственно перед точкой, как в примере с clock.tick или в 101. to_s. Иногда же это не столь очевидно, например, в арифметических методах. Выясняется, что 5 + 5 это на самом деле просто сокращённый способ записи 5.+ 5. Например:

puts 'привет '.+ 'мир' puts (10.* 9).+ 9

привет мир 99

Выглядит не слишком привлекательно, поэтому мы больше не будем записывать методы в таком виде. Но нам ведь важно понимать, что же происходит в действительности. (На моей машине, эта программа также выдаёт мне такое предупреждение:

warning: parenthesize argument(s)for future_version

[предупреждение: заключите аргумент(ы) в скобки для будущих версий – Прим. перев.].

Этот код прекрасно выполнился, но мне было сказано, что возникли трудности при выяснении, что я имею в виду, поэтому на будущее рекомендуется использовать дополнительно скобки.) И это также даёт нам более глубокое понимание, почему мы можем выполнить 'pig'*5, но не можем выполнить 5*'pig': 'pig'*5 указывает 'pig' выполнить умножение, а 5*'pig' предписывает числу 5 выполнить умножение. Строка 'pig' знает, как сделать 5 собственных копий и объединить их вместе; однако, числу 5 будет затруднительно сделать 'pig' копий самого себя и сложить их вместе.

И, конечно, нам всё ещё нужно выяснить про puts и gets. Где же их объекты? В английском [и в русском – Прим. перев.] языке, вы можете иногда опустить существительное; например, если злодей завопит «Умри!», неявным существительным будет тот, кому он кричит. В Ruby, если я говорю puts ' быть

или не быть', на самом деле я говорю: self.puts 'быть или не быть'. Но что же такое self? Это специальная переменная, которая указывает на тот объект, в котором вы находитесь. Мы пока что не знаем, как находиться внутри объекта, но покуда мы это не выяснили, мы всегда будем находиться в большом объекте, которым является… вся наша программа! И к счастью для нас, у этой программы есть несколько собственных методов, наподобие puts и gets. Посмотрите:

iCantBelieveIMadeAVariableNameThisLongJustToPointToA3 = 3 puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3 self.puts iCantBelieveIMadeAVariableNameThisLongJustToPointToA3 3 3

Если вы не совсем въехали во всё это, это нормально. Самое важное, что нужно из всего этого уяснить, это то, что каждый метод выполняется некоторым объектом, даже если перед ним не стоит точка. Если вы понимаете это, то вы вполне готовы двигаться дальше.

Забавные строковые методы

Давайте изучим несколько забавных строковых методов. Вам не нужно их все запоминать; достаточно просто ещё раз взглянуть на эту страницу, если вы их позабудете. Я только хочу показать вам небольшую часть того, что могут делать строки. На самом деле, я и сам не могу запомнить даже половины строковых методов – но это нормально, потому что в Интернете есть замечательные справочники, где перечислены и объяснены все строковые методы. (Я покажу вам, где их найти в конце этого учебника.) Серьёзно, я даже не хочу знать все строковые методы: это всё равно, что знать каждое слово в словаре. Я прекрасно могу говорить по-английски, не зная всех слов в словаре… и ведь не в этом же заключается сам смысл словаря? Вам ведь не требуется знать всё, что в нём содержится?

Итак, наш первый строковый метод это reverse, который выдаёт значение строки, перевёрнутое задом наперёд:

varl = 'барк' var2 = 'телекс'

var3 = 'Вы можете произнести это предложение наоборот?'

puts varl.reverse

puts var2.reverse

puts var3.reverse

puts varl

puts var2

puts var3

краб

скелет

?торобоан

еинежолдерп отэ итсензиорп

етежом ыВ

барк

телекс

Вы можете

произнести это предложение

наоборот?

Как видите, reverse не переворачивает значение исходной строки, он просто создаёт её новую перевёрнутую копию. Вот почему в vari по-прежнему содержится 'барк' даже после того, как мы вызвали reverse у vari.