В последней части этой серии мы познакомились с языком программирования 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, чтобы убедиться, что он работает.
Веб 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 , вы должны увидеть форму, похожую на приведенную ниже на скриншоте:
Получайте удовольствие, заполняя форму и создавая забавные Madlibs!
Это все люди
В следующей части серии мы собираемся получить математические данные, рассматривая числа и логику управления. А пока поиграйте с тем, что мы уже рассмотрели, и обязательно оставляйте любые вопросы или комментарии ниже.