Сегодня у нас действительно маленькая капля — немного остаточной, но серьезной и важной информации о Руби, которая, возможно, будет интересна для пишущих на других языках.
Метод
Переменые
Иногда Руби самостоятельно копирует объекты и замораживает копии. Например, когда вы используете строку в качестве ключа хэша, Руби замораживает ее копию и в дальнейшем использует именно ее. Поэтому даже если строка изменится, на ключ это не повлияет.
В
В отличие от
Модули в Руби похожи на классы в том, что они содержат набор методов, константы, другие модули и определения классов. Модули задаются как классы, только слово
Есть два предназначения модулей. Во-первых, они служат централизованного хранения констант и методов, например:
Во-вторых, модули позволяют делить функциональность между классами, при включении (
Руби (в отличие от С++) не разрешает множественное наследование, заменяют его
Это, конечно, не всё, что хочется рассказать о Руби. Однако в практике чистый Ruby не столь интересен — за рамки консоли мы, пока, выйти не можем, что достаточно ограничивает нас. Я думаю, что и у вас, как у меня, есть желание перейти на огромный полигон Rails, где мы максимально сможем реализовать накопленные знания о языке и развиваться в Руби дальше. Так что я с предложением — давайте не закрывая капли Руби перейдем на изучение фрэймворка Rails/ Как вам? Можно? Жду комментариев!
Замораживание объектов
Метод
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/ Как вам? Можно? Жду комментариев!