Как стать автором
Обновить

Покорим Ruby вместе! Капля девятая

Программирование*
Сегодня у нас действительно маленькая капля — немного остаточной, но серьезной и важной информации о Руби, которая, возможно, будет интересна для пишущих на других языках.

Замораживание объектов



Метод freeze в классе Object защищает объект от изменений, превращая его в константу. После «заморозки» объекта, любая попытка изменить его превратится в ошибку TypeError. Метод frozen? позволит узнать, заморожен ли объект:


a = b = 'Original String'
b.freeze
puts a.frozen? # true
puts b.frozen? # true
a = 'New String'
puts a
puts b
puts a.frozen? # false
puts b.frozen? # true


Переменые a и b сначала ссылаются на один объект, поэтому true в двух первых случаях.

Иногда Руби самостоятельно копирует объекты и замораживает копии. Например, когда вы используете строку в качестве ключа хэша, Руби замораживает ее копию и в дальнейшем использует именно ее. Поэтому даже если строка изменится, на ключ это не повлияет.

Сериализация объектов



В Java есть возможность сериализировать объекты, позволяя сохранять их в бинарном виде в файл и извлекать по мере надобности. Руби называет этот вид сериализации маршалингом (marshaling), при этом используется встроенная библиотека Marshal. Основные методы – dump и load:

f = File.open( 'peoples.sav', 'w' ) 
Marshal.dump( ["bred", "bert", "kate"], f ) 
f.close 

File.open( 'peoples2.sav', 'w' ){ |friendsfile|   
    Marshal.dump( ["anny", "agnes", "john" ], friendsfile ) 
} 

myfriends = Marshal.load(File.open('peoples.sav' )) 
morefriends = Marshal.load(File.open('peoples2.sav' )) 
puts myfriends
puts morefriends


В отличие от Marshal, библиотека YAML позволяет сохранять данные в текстовом формате, о ней как-нибудь в другой раз.

Модули и Примеси



Модули в Руби похожи на классы в том, что они содержат набор методов, константы, другие модули и определения классов. Модули задаются как классы, только слово module используется вместо class. В отличие от классов создать объекты на основе модуля нельзя, модуль не может иметь подклассы. Вместо этого вы добавляете недостающую функциональность класса или отдельного объекта с помощью модуля. Модули – одиночки, нет иерархии и наследования. (Вообще класс Module имеет суперкласс — Object, однако любой созданный модуль суперкласса не имеет).

Есть два предназначения модулей. Во-первых, они служат централизованного хранения констант и методов, например:

module Trig 
	PI = 3.1416 
	# методы класса
	def Trig.sin(x) 
		# ... 
	end 
	def Trig.cos(x) 
		# ... 
	end 
end


Во-вторых, модули позволяют делить функциональность между классами, при включении (include) модуля в класс, его методы добавляются в класс. Такой способ называется примесью (mixin):

module MyModule
   GOODMOOD = "happy"
   BADMOOD = "grumpy"
   
	def greet
		return "I'm #{GOODMOOD}. How are you?"
	end
	
	def MyModule.greet
		return "I'm #{BADMOOD}. How are you?"
	end
end

class MyClass
   include MyModule
	
	def sayHi
		puts( greet )
	end
end

ob = MyClass.new
ob.sayHi
puts(ob.greet)


Руби (в отличие от С++) не разрешает множественное наследование, заменяют его mixin’ы.

Эпилог



Это, конечно, не всё, что хочется рассказать о Руби. Однако в практике чистый Ruby не столь интересен — за рамки консоли мы, пока, выйти не можем, что достаточно ограничивает нас. Я думаю, что и у вас, как у меня, есть желание перейти на огромный полигон Rails, где мы максимально сможем реализовать накопленные знания о языке и развиваться в Руби дальше. Так что я с предложением — давайте не закрывая капли Руби перейдем на изучение фрэймворка Rails/ Как вам? Можно? Жду комментариев!
Теги:rubyпрограммированиемаршалингmixintutorialучебник
Хабы: Программирование
Всего голосов 57: ↑42 и ↓15+27
Просмотры25K
Комментарии Комментарии 32

Похожие публикации

Лучшие публикации за сутки