Статьи

Начало работы с Ruby, II: строки и вещи

В последней части этой серии мы познакомились с языком программирования Ruby и написали нашу первую программу. Мы также использовали IRB для экспериментов и разместили нашу программу в Интернете с помощью Sinatra. В этом посте мы рассмотрим строки и их методы, а также переменные для хранения информации.

Теория струн

Строка в Ruby — это набор букв (или, точнее, «символов»). Строковый литерал можно создать, написав группу символов внутри кавычек:

"hello" 

Вы также можете использовать одинарные кавычки:

 'hi there' 

Если вы хотите использовать кавычки внутри строкового литерала, вы можете просто использовать другой тип кавычки следующим образом:

 "It's done like this" 

Или, если хотите, вы можете избежать кавычки, используя символ \ , например:

 'Here\'s another way to do it' 

В последнем посте я упоминал, что все в Ruby является объектом . Объекты могут выполнять действия, называемые методами. Есть несколько способов заставить объект выполнить метод, но наиболее распространенным является точечная нотация, которая выглядит следующим образом:

 object.method 

Давайте использовать irb, чтобы поиграться с некоторыми строковыми объектами и методами — откройте консоль терминала и запустите IRB, используя следующую команду:

 $ irb 

Теперь давайте посмотрим на length в строковом литерале объекта «hello»:

 > "hello".length => 5 

Это метод длины, и, как вы можете видеть, он сообщает нам, сколько символов в строке.

переменные

Переменные очень распространены в языках программирования. Они способ хранения объекта в памяти для последующего использования. В Ruby мы можем очень легко назначить переменную объекту, используя оператор = , как в примере ниже:

 name = "Darren" 

Это означает, что я могу вызывать методы для переменной, вместо того, чтобы каждый раз вводить строку:

 > name.length => 6 

Теперь мое имя хранится в виде переменной, давайте попробуем еще несколько методов, которые можно использовать для строковых объектов. Мы можем написать это задом наперед:

 > name.reverse => "nerraD" 

… написать заглавными буквами:

 > name.upcase => "DARREN" 

…. или строчные буквы:

 > name.downcase => "darren" 

Есть множество других строковых методов. Вы можете узнать, что они из себя представляют, вызвав метод method для строки (верно, есть «метод» для определения методов объекта!)

 > name.methods => [:<=>, :==, :===, :eql?, :hash, :casecmp, :+, :*, :%, :[], :[]=, :insert, :length, :size, :bytesize, :empty?, :=~, :match, :succ, :succ!, :next, :next!, :upto, :index, :rindex, :replace, :clear, :chr, :getbyte, :setbyte, :byteslice, :to_i, :to_f, :to_s, :to_str, :inspect, :dump, :upcase, :downcase, :capitalize, :swapcase, :upcase!, :downcase!, :capitalize!, :swapcase!, :hex, :oct, :split, :lines, :bytes, :chars, :codepoints, :reverse, :reverse!, :concat, :<<, :prepend, :crypt, :intern, :to_sym, :ord, :include?, :start_with?, :end_with?, :scan, :ljust, :rjust, :center, :sub, :gsub, :chop, :chomp, :strip, :lstrip, :rstrip, :sub!, :gsub!, :chop!, :chomp!, :strip!, :lstrip!, :rstrip!, :tr, :tr_s, :delete, :squeeze, :count, :tr!, :tr_s!, :delete!, :squeeze!, :each_line, :each_byte, :each_char, :each_codepoint, :sum, :slice, :slice!, :partition, :rpartition, :encoding, :force_encoding, :b, :valid_encoding?, :ascii_only?, :unpack, :encode, :encode!, :to_r, :to_c, :>, :>=, :<, :<=, :between?, :nil?, :!~, :class, :singleton_class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :object_id, :to_enum, :enum_for, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__, :__id__] 

Есть довольно много странных, но должно быть очевидно, что некоторые из них делают, если нет, вы можете узнать, прочитав документацию .

Взрыв! методы

Некоторые методы фактически не изменят сам объект. Например, давайте посмотрим на reverse метод. Это, как вы можете догадаться, записывает строку в обратном направлении, например так:

 > name.reverse => "nerraD" 

Теперь посмотрим на объект, сохраненный как name переменной:

 > name => "Darren" 

Объект не изменился. reverse метод возвратил строку, которая была обратным name , но на самом деле он не изменил само name .

Есть еще один метод String, который называется reverse! (на конце есть восклицательный знак или «взрыв»). Это пример «метода взрыва», а в Ruby это означает «будьте осторожны, этот метод может быть опасным». В случае reverse! это означает, что он изменит строку, которая вызывает метод, как вы можете видеть в следующем примере:

 > name.reverse! => "nerraD" name => "nerraD" 

Теперь строка, сохраненная как name , была изменена навсегда. Большинство строковых методов имеют «взрывной эквивалент», например, upcase! и downcase! методы тоже.

Методы сцепления

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

 > name = "Darren" => "Darren" > name.reverse.upcase => "NERRAD" 

Методы применяются по порядку слева направо (хотя в этом случае это не имеет значения, а может и в других).

интерполирование

Интерполяция — это аккуратный способ вставки кода Ruby в строку. Это делается путем помещения кода внутри #{ these symbols } внутри строки следующим образом:

 "Welcome to my program, #{name}" => "Welcome to my program, Darren" "Do you know that you're name backwards is #{name.reverse.downcase.capitalize}?" => "Do you know that you're name backwards is Nerrad?" 

ПРИМЕЧАНИЕ. Строка ДОЛЖНА быть строкой в ​​двойных кавычках. Строки в одинарных кавычках не выполняют интерполяцию.

Программа приветствия

Теперь мы поиграли с некоторыми строками в IRB, пришло время написать настоящую программу на Ruby. Создайте файл с именем «greeter.rb» и введите следующий код:

 puts "Please enter your name:" name = gets.chomp puts "Hello #{name}! Did you know that you're name has #{name.length} letters in it and written backwards it is '#{name.reverse.downcase.capitalize}'?" 

Мы видели метод puts в последнем посте . Мы использовали его здесь, в первой строке, чтобы вывести строку «Пожалуйста, введите ваше имя:» в терминал. Во второй строке мы представляем новый метод с именем gets. Это приостановит программу и будет ждать ввода от пользователя (завершается нажатием клавиши ВВОД). Это будет храниться в переменной с именем name . Это будет строка, и мы применим к ней метод с именем chomp . chomp удаляет символ, созданный нажатием клавиши ENTER в конце строки. Затем мы можем использовать строковую интерполяцию и некоторые из только что изученных строковых методов для отображения информации об имени человека.

Если вы запустите программу, введя ruby greeter.rb в терминал, вы должны увидеть что-то похожее на следующее:

 $ ruby greeter.rb Please enter your name: Darren Hello Darren! Did you know that you're name has 6 letters in it and written backwards it is 'Nerrad'? 

Программа Madlibs

Наша следующая программа — простая реализация игры Madlibs , где пользователь вводит названия некоторых вещей, и они соединяются, чтобы сделать (возможно) юмористическую фразу. Введите следующий код в файл с именем ‘madlibs.rb’:

 puts "Please enter an animal:" animal = gets.chomp puts "Please enter an type of person:" person = gets.chomp puts "Please enter an object:" object = gets.chomp puts "Please enter an adjective:" adjective = gets.chomp puts "Please enter a verb:" verb = gets.chomp puts "The #{adjective} #{animal} started to #{verb} because the #{person} ran away with the #{object}" 

Этот код использует несколько операторов get для получения большого количества данных от пользователя и установки каждой части информации в качестве отдельной переменной. Строковая интерполяция затем используется для отображения информации, введенной в предложении. Если вы попытаетесь запустить его с помощью команды ruby madlibs.rb , вы должны увидеть что-то похожее на следующее:

 $ ruby madlibs.rb Please enter an animal: cow Please enter an type of person: prince Please enter an object: banana Please enter an adjective: fuzzy Please enter a verb: cry The fuzzy cow started to cry because the prince ran away with the banana 

Повеселись, играя с этим!

Онлайн программа приветствия

Теперь давайте используем Sinatra для создания веб-версий двух только что созданных программ. Большая часть кода будет такой же, но способ получения информации от пользователя в Интернете отличается. Есть два способа получения данных в Интернете — из строки URL или из форм. Мы воссоздадим программу приветствия, взяв имя человека из URL. Сохраните следующий код в файле с именем «web_greeter.rb»:

 require 'sinatra' get '/:name' do name = params[:name] "Hello #{name}! Did you know that you're name has #{name.length} letters in it and written backwards it is '#{name.reverse.downcase.capitalize}'?" end 

Здесь у нас есть другой обработчик маршрута, который мы использовали в предыдущем посте, но строка содержит :name которое называется именованным параметром . Это специальные токены в URL, которые могут иметь любое значение. Значение, которое вводится в URL, содержится в хэше params . Это специальный контейнер, в котором все значения, введенные пользователем, хранятся так же, как и переменная (подробнее о хешах мы узнаем позже).

Например, если я введу URL-адрес «http: // localhost: 4567 / Darren» в браузере, значением params[:name] будет «Darren». Если бы я зашел в браузер на «http: // localhost: 4567 / Daz», значение params[:name] будет «Daz».

Значение в квадратных скобках после params должно совпадать с тем, которое использовалось в названном параметре в обработчике маршрута. Это позволяет вам использовать столько именованных параметров, сколько вам нужно.

Чтобы попробовать это, введите ruby web_greeter.rb в терминал, а затем перейдите по адресу http: // localhost: 4567 / Darren, и в вашем браузере должно появиться сообщение, подобное показанному на скриншоте ниже. Попробуйте ввести разные имена в URL, чтобы убедиться, что он работает.

screenshot2

Веб Madlibs

Для веб-программы Madlibs мы будем использовать HTML-форму для ввода данных. Введите следующий код и сохраните его как web_madlibs.rb:

 require 'sinatra' get '/madlibs' do erb :questions end post '/madlibs' do animal = params[:animal] person = params[:person] object = params[:object] adjective = params[:adjective] verb = params[:verb] "The #{adjective} #{animal} started to #{verb} because the #{person} ran away with the #{object}" end __END__ @@questions <!doctype html> <html> <header> <title>Madlibs</title> </header> <body> <form method="POST" action="/madlibs"> <p>Animal:</p> <input name="animal"> <p>Person:</p> <input name="person"> <p>Object:</p> <input name="object"> <p>Adjective:</p> <input name="adjective"> <p>Verb:</p> <input name="verb"> <input type="submit" value="Create Madlib"> </form> </body> </html> 

Это наша самая сложная программа, которую мы создали до сих пор, но она не так плоха, как кажется, если разбить ее на куски.

Первая часть — это очень простой обработчик маршрута. В нем говорится, что если пользователь посещает маршрут «/ madlibs», то мы будем использовать ERB для отображения представления под названием «вопросы».

ERB расшифровывается как «Embedded Ruby» и представляет собой движок шаблонов, который используется для генерации динамического HTML. Представление — это фрагмент кода HTML, который отображается браузером. В этом примере мы используем встроенные представления , что означает, что вы пишете их внизу файла после объявления __END__ . Название представления начинается с @@ . Здесь мы создали представление под названием «Вопросы», которое на самом деле представляет собой лишь небольшой фрагмент HTML-кода, отображающий форму с некоторыми полями ввода. Важной частью формы являются два атрибута method="POST" action="/madlibs" . Это говорит Синатре использовать глагол HTTP POST для отправки формы по маршруту / madlibs.

Затем мы используем эту информацию для создания обработчика маршрута, чтобы иметь дело с тем, что происходит при отправке формы. Обратите внимание, что второй обработчик маршрута использует глагол «post» вместо «get» — это потому, что он имеет дело только с опубликованными маршрутами (например, из нашей формы).

Внутри блока после обработчика маршрута мы затем пишем код, который обрабатывает информацию, представленную в форме. Это снова сохраняется в хэше params . Каждое поле ввода содержит атрибут name который сообщает Синатре, где сохранить значение, введенное в это поле, в хэш params.

Поэтому значение, введенное в поле ввода с атрибутом name="animal" будет сохранено в params[:animal] . В обработчике маршрута мы храним каждый фрагмент информации как переменную, а затем используем тот же бит интерполяции строк, что и в программе, которую мы написали ранее, для отображения нашего Madlib.

Чтобы попробовать это, убейте сервер, если он все еще работал ранее, удерживая нажатой клавишу «Ctrl» и нажимая «C». Затем снова запустите сервер, введя ruby web_madlibs.rb в терминал. Если вы зайдете в браузер по адресу http: // localhost: 4567 / madlibs , вы должны увидеть форму, похожую на приведенную ниже на скриншоте:

Screenshot3

Получайте удовольствие, заполняя форму и создавая забавные Madlibs!

Это все люди

В следующей части серии мы собираемся получить математические данные, рассматривая числа и логику управления. А пока поиграйте с тем, что мы уже рассмотрели, и обязательно оставляйте любые вопросы или комментарии ниже.