Среди множества языков программирования особое место занимает Ruby. Этот язык разработан японским программистом Юкихиро Мацумото в 1995 году. К настоящему времени Ruby находится в одном ряду с такими известными языками как Python, Java.
В этом разделе будут размещены статьи по различным направлениям применения этого удивительного языка.
Раздел находится в состоянии правки.
"Язык образует среду мышления и формирует представление о том, о чем мы думаем".
(Б.Л.Уорф)
"Ruby предназначен для того, чтобы сделать программистов счастливыми"
(Юкихиро Мацумото)
Содержание.
Примеры программ.
Интерактивный режим
Консольный ввод/вывод
Алгоритмические конструкции.
Объектно-ориентированное программирование и Ruby
Класс. Объект.
Графический интерфейс (GTK).
Первое приложение.
Кнопки.
Примеры программ.
Язык Ruby - очень оригинальный и очень выразительный язык, позволяющий писать инструкции, которые не возможно так же коротко выразить средствами любого другого языка. Вот некоторые из них:
Обработка строк(Класс String).
1. Определить является ли данная строка палиндромом.
первый вариант (более традиционный)
a=gets.chomp
(a.reverse==a) ? puts "палиндром" : puts "не палиндром"
второй вариант (добавить метод к классу String)
class String
def is_pol?
self.reverse==self ? true : false
end
end
puts "Палиндром" if gets.chomp.is_pol?
2. Удалить все цифры из строки:
p gets.chomp.split(/[0123456789]/).join
3. Подсчитать количество слов в строке.
p gets.chomp.strip.split.size
Обработка целых чисел (Integer)
На самом деле класс Integer является предком классов Fixnum и Bignum. Объекты первого - короткие целые, второго - длинные целые. Насколько длинные? - Не знаю, у меня подсчитал значение выражения
>9999999999999999999999999999999999999999999**100
вот что получилось:
9999999999999999999999999999999999999999900000000000000000000000000000000000000000494999999999999999999999999999999999999998383000000000000000000000000000000000000003921224999999999999999999999999999999999992471248000000000000000000000000000000000011920523999999999999999999999999999999999983992439200000000000000000000000000000000018608789429999999999999999999999999999999980977681916000000000000000000000000000000017310309456439999999999999999999999999999985837019535640000000000000000000000000000010504210511066999999999999999999999999999992889457500200800000000000000000000000000004418694267732359999999999999999999999999997466615286500113600000000000000000000000001345860629046814649999999999999999999999999334986512706279820000000000000000000000000306645108029882082999999999999999999999999867658427060787732600000000000000000000000053598337040380968296999999999999999999999979581585889378678744000000000000000000000007332066885177656269199999999999999999999997513472969374533960880000000000000000000000797760755659003687550999999999999999999999757480730279662878984496000000000000000000069957481650097246446779999999999999999999980826467992195569492364000000000000000000004998813702034726525205099999999999999999998758915218805171345466320000000000000000000293723398216109448239637599999999999999999933675361693136576203952800000000000000000014301250134917425756022677499999999999999997053075729774591056334721000000000000000000580717429720889409486981449999999999999999890493284681203711353883498000000000000000019772045821449329894437701749999999999999996579970452506061856097262400000000000000000567004898663468692278611759999999999999999909860759699653695073656592000000000000000013746234145802811501267369719999999999999997988355978663003194936482480000000000000000282588088711625741663684603999999999999999961883467104013272054665797600000000000000004937823579707371574736476219999999999999999385515287858638204032794070400000000000000073470998190814997343905056799999999999999991558651271693596049849206240000000000000000932065588750498769495816810999999999999999901086917112191967318811277200000000000000010089134454556419333481249725599999999999999010869171121919673188112772000000000000000093206558875049876949581681099999999999999991558651271693596049849206240000000000000000734709981908149973439050567999999999999999938551528785863820403279407040000000000000004937823579707371574736476219999999999999999618834671040132720546657976000000000000000028258808871162574166368460399999999999999997988355978663003194936482480000000000000000137462341458028115012673697199999999999999990986075969965369507365659200000000000000000567004898663468692278611759999999999999999965799704525060618560972624000000000000000001977204582144932989443770174999999999999999890493284681203711353883498000000000000000005807174297208894094869814499999999999999999705307572977459105633472100000000000000000014301250134917425756022677499999999999999999336753616931365762039528000000000000000000029372339821610944823963759999999999999999998758915218805171345466320000000000000000000049988137020347265252050999999999999999999998082646799219556949236400000000000000000000069957481650097246446779999999999999999999997574807302796628789844960000000000000000000079776075565900368755099999999999999999999997513472969374533960880000000000000000000000073320668851776562691999999999999999999999997958158588937867874400000000000000000000000053598337040380968296999999999999999999999998676584270607877326000000000000000000000000030664510802988208299999999999999999999999999334986512706279820000000000000000000000000013458606290468146499999999999999999999999999746661528650011360000000000000000000000000004418694267732359999999999999999999999999999928894575002008000000000000000000000000000001050421051106699999999999999999999999999999985837019535640000000000000000000000000000000173103094564399999999999999999999999999999998097768191600000000000000000000000000000000018608789429999999999999999999999999999999999839924392000000000000000000000000000000000001192052399999999999999999999999999999999999992471248000000000000000000000000000000000000039212249999999999999999999999999999999999999838300000000000000000000000000000000000000000494999999999999999999999999999999999999999999000000000000000000000000000000000000000000001
Думаю что это много даже по меркам Вселенной.
1. Проверить, является ли данное число числом Амстронга (если каждую цифру возвести в степень равную количеству цифр и полученные результаты сложить то получится число равное исходного)
#!/usr/bin/env ruby
#coding:utf-8
class String
def is_amstr?
(self.chomp.split(//).map(&:to_i).inject(0) do |r,d|
r+=d**(self.chomp.size)
end)==(self.to_i)?(true):(false)
end
end
print "введите число:"
p gets.is_amstr?
Удивительно, в Ruby можно изменять классы "на лету"
2. Проверить является ли данное число счастливым.
#!/usr/bin/env ruby
#coding:utf-8
class Fixnum
def is_a?
c=0
(self.to_s.split(//).map(&:to_i).inject(0) do |r,d|
c+=1
if(c<=self.to_s.size/2)
r+=d
else
r-=d
end
end)==0?(true):(false)
end
end
print "введите число:"
p gets.to_i.is_a?
Интерактивный режим.
Ruby может с успехом работать в интерактивном режиме.
Для этого существует приложение irb. Например, можно организовать вычисление значений довольно сложных выражений:
irb(main):001:0> 2345*(3456-4.5)*3456/(456765.45-3.4567)
=> 61239.90369231099
irb(main):002:0>
Какой калькулятор способен справится с подобным выражением?
И это еще не все. Ruby с успехом может работать с обыкновенными дробями. Для этого существует класс Rational.
irb(main):002:0> Rational(2,3)*Rational(45,68)
=> (15/34)
irb(main):003:0>
Рассмотрим задачку посложнее:
Вычислить значение выражения (2/5+5/8)/(2/5*((5/8)^2-3/7)
irb(main):033:0> a,b,c=Rational(2,5),Rational(5,8),Rational(3,7)
=> [(2/5), (5/8), (3/7)]
irb(main):034:0> (a+b)/(a*(b**2-c))
=> (-1148/17)
irb(main):035:0>
И на прощание с интерактивным режимом:
irb(main):035:0> 2**100
=> 1267650600228229401496703205376
Когда-то, мы с друзьями пытались возвести 2 в сотую степень, не одну неделю потратили.
Так что во-первых мы получили отличный калькулятор.
Консольный ввод/вывод.
Ввод информации с консоли организуется вызовом глобального метода gets. Этот метод возвращает объект-строку, которая может преобразовывать себя в число, список и другие объекты.
например:
a = gets.to_i #получить строку и преобразовать в целое число, если возможно. Результат записать в переменную a.
Вывод информации:
1. Отладочный вывод организуется вызовом глобального метода p.
Например:
arr=[1,3,4]
p arr
=> [1,3,4]
2. Вывод строки организуется методом puts.
Замечательно то, что в любое место строки можно подставить значение выражения, например:
puts "дважды-два = #{2*2}"
=>дважды-два = 4
3. Вывод списка различный по типу элементов организуется методом print. После вывода новая строка консоли не начинается.
Например:
print "результат:",5*11
=> результат:55
Алгоритмические конструкции в Ruby.
Все современные выпускники основной школы так или иначе знакомы с основными алгоритмическими конструкциями: ветвление, выбор, цикл. Какие же возможности для их реализации есть в ruby?
Ветвление.
Для реализации ветвления можно использовать стандартный оператор:
if условие then
серия 1
else
серия 2
end
Этот оператор, в той или иной модификации, используется во многих языках программирования. Также можно встретить сокращенный условный оператор:
if условие then
серия 1
end
В Ruby можно использовать и такую конструкцию:
выражение if условие
Значение выражения будет вычислено если верно условие, например:
y=5/x if x!=0
Циклы.
Цикл - это повторение одного и того же действия заданное количество раз или пока верно/неверно условие.
Существует много способов организовать такие повторения.
1. повторять пока верно условие:
while условие do
Действие
end
2. повторять заданное количество раз:
n.times do
действие
end
Можно ввести переменную где будет хранится очередное значение счетчика и возможно использовать это значение в цикле, например:
10.times do |x|
print "#{x} "
end
Объектно-ориентированное программирование и Ruby
Для успешного освоения идей объектно-ориентированного программирования необходим язык программирования, который при простоте синтаксиса, является полностью объектно-ориентированным.
Более всего отвечает этим требованиям Ruby. В этом языке все считается объектом: число, строка, массив и другие понятия.
Концепция "хорошо все то, что не кажется мне странным" высказанная Мацумото на заре Ruby позволила создать язык, который не диктует программисту своих условий, не навязывает свой синтаксис. Здесь мирно уживается синтаксис C и Ada/
К услугам адептов структурного программирования имеется много разновидностей управляющих конструкций (циклов, условных операторов и т. д.) . Они могут вовсе отказаться от объектно-ориентированной парадигмы.
Однако в полной мере мощь языка проявляется при объектно-ориентированном подходе. Тут Вам и изменение классов "на лету", инкапсуляция, примеси, итераторы для многих классов, использование в качестве параметра блоков кода.
Интерпретатор JRuby позволят использовать Ruby на Java платформах например, Андройд
Фреймворк Rails, написанный на Ruby и использующий его в качестве основного языка сопровождения позволят значительно ускорить разработку и сопровождение web сайтов.
Класс. Объект.
Весь мир состоит из объектов. Для удобство объекты разбиваются на классы с общими свойствами и способностями выполнять какие-то действия. Например, классы животных, растений, автомобилей, людей.
Таким образом, класс — это набор свойств и методов(способностей). Это просто каркас, который наполнит содержимым конкретный объект.
Например, класс Dog содержит свойства: name(кличка), color(масть), breed(порода) и способности: bark(лаять), lie(лежать).
Если выбрать конкретного Шарика, то класс наполнится содержимым:
свойства:
name="Шарик"
color="рыжий"
breed="дворняжка"
методы:
bark — лаять на посторонних.
lie — лежать когда устал или скомандовал хозяин.
Вот и получается, что объект — это представитель(экземпляр) класса.
Описание класса.
В качестве примера выберем класс Person, объекты которого имеют свойства: name(имя), date(дата рождения),street(улица проживания) и методы: getName(сообщить имя), getDate(сообщить дату рождения), getStreet(сообщить улицу проживания).
Коротко класс определяется так:
class имя
//свойства и методы
end
Определим класс Person:
#!/usr/bin/env ruby
#coding:utf-8
class Person
def initialize name,date,street
@name,@daate,@street=name,date,street
end
def getName
@name
end
def getDate
@date
end
def getStreet
@street
end
end
В классе Person определен два метод initialize. Он вызывается при создании объекта. Ему передаются значения свойств name,date и street. Эти значения записываются в свойства объекта @name, @date и @street. Символ @ (собака) указывает на то, что это внутренние свойства объекта.
После описания класса можно определять объекты ему принадлежащие и вызывать методы этих объектов:
prc1 = Person.new "Вася","12.01.2001","Школьная"
prc2 = Person.new "Петя","11.05.2000","Советская"
puts prc1.getName
puts prc2.getDate
Важное в этом пункте.
Класс — это совокупность свойств и методов.
Объект — это представитель(экземпляр) класса.
Свойство — это отличительная особенность объектов класса.
Метод — это способность выполнить действие.
Определение класса:
class имя
def initialize
#конструктор, инициализация свойств и другие стартовые действия
end
#другие методы
end
Контрольные вопросы.
-
Что такое класс?
-
Что такое объект?
-
Что такое свойство?
-
Что такое метод?
-
Как определить класс?
-
Каково имя конструктора и его назначение?
-
Чем отличаются переменные объекта?
Задания.
-
Добавьте к классу Person метод Hello(приветствие всем).
-
Определите класс Dog.
-
Проверьте полученные приложения в работе.
Графический интерфейс.
Практически любое современное приложение имеет графический интерфейс: главное окно, меню, кнопки, переключатели и другие элементы.
Для Ruby написано несколько библиотек, позволяющих создавать графический интерфейс. Одна из распространенных GTK (GIMP ToolKit).
Эта библиотека свободно распространяется и Вы можете использовать ее в своих приложениях.
Простейшее приложение.
#!/usr/bin/env ruby
#coding:utf-8
require 'gtk2'
class MyWindow < Gtk::Window
def initialize
super
set_title "первое приложение"
signal_connect "destroy" do
Gtk.main_quit
end
set_default_size 300, 150
show
end
end
Gtk.init
window = MyWindow.new
Gtk.main
Подключить модуль gtk2
require 'gtk2'
Установка текста в заголовок окна
set_title "первое приложение"
Определение отклика на сигнал "destroy": завершение работы приложения
signal_connect "destroy" do
Gtk.main_quit
end
Установка размеров окна
set_default_size 300, 150
Показать окно
show
Инициализация Gtk
Gtk.init
Создание объекта-окно
window = MyWindow.new
Запуск главного цикла
Gtk.main
Кнопки.
Редкое приложение обходится без кнопок. Добавить кнопку к к главному окну дело простое:
- Указываем место и стили
- Программируем обработчик события "clicked" - нажатие на кнопку.
Вот примерный код:
#!/usr/bin/env ruby
#coding:utf-8
require 'gtk2'
class ButtApp < Gtk::Window
def initialize
super
init_ui
end
def init_ui
fixed = Gtk::Fixed.new
add fixed
button = Gtk::Button.new "Выход"
button.set_size_request 80, 35
button.signal_connect "clicked" do
Gtk.main_quit
end
fixed.put button, 50, 50
set_title "Кнопка с откликом"
signal_connect "destroy" do
Gtk.main_quit
end
set_default_size 300, 200
set_window_position(:center)
show_all
end
end
Gtk.init
window = ButtApp.new
Gtk.main
Внимательный читатель заметил вызов метод init_ui в конструкторе. Это позволяет отделить описание пользовательского интерфейса.
Сам метод определен ниже.
Продолжение следует...
|