Программирование на языке Ruby - Страница 19
Ознакомительная версия. Доступно 54 страниц из 266. action1
end
elsif platform == Linux
def my_action
action2
end
else
def my_action
default_action
end
end
Таким способом мы достигаем желаемого результата, но условие вычисляется только один раз. Когда программа вызовет метод
my_action
1.4.2. Отражение
В языках Smalltalk, LISP и Java реализована (с разной степенью полноты) идея рефлексивного программирования — активная среда может опрашивать структуру объектов и расширять либо модифицировать их во время выполнения.
В языке Ruby имеется развитая поддержка отражения, но все же он не заходит так далеко, как Smalltalk, где даже управляющие конструкции являются объектами. В Ruby управляющие конструкции и блоки не представляют собой объекты. (Объект
Proc
Для определения того, используется ли идентификатор с данным именем, служит ключевое слово
defined?
if defined? some_var
puts "some_var = #"
else
puts "Переменная some_var неизвестна."
end
Аналогично метод
respond_to?
respond_to?
Object
В Ruby запрос информации о типе во время выполнения поддерживается очень полно. Тип или класс объекта можно определить, воспользовавшись методом
type
Object
is_a?
kind_of?
puts "abc".class "" # Печатается String
puts 345.class # Печатается Fixnum
rover = Dog.new
print rover.class # Печатается Dog
if rover.is_a? Dog
puts "Конечно, является."
end
if rover.kind_of? Dog
puts "Да, все еще собака."
end
if rover.is_a? Animal
puts "Да, он к тому же и животное."
end
Можно получить полный список всех методов, которые можно вызвать для данного объекта. Для этого предназначен метод
methods
Object
private_instance_methods
public_instance_methods
Аналогично можно узнать, какие переменные класса или экземпляра ассоциированы с данным объектом. По самой природе ООП в перечни методов и переменных включаются те, что определены как в классе самого объекта, так и во всех его суперклассах. В классе
Module
constants
В классе
Module
ancestors
Mod.ancestors
Mod
В классе
Object
superclass
nil
Object
nil
Модуль
ObjectSpace
_idtoref
ObjectSpace
each_object
Fixnum
NilClass
TrueClass
FalseClass
1.4.3. Отсутствующие методы
При вызове метода (
myobject.mymethod
1. Синглетные методы, определенные для объекта
myobject
2. Методы, определенные в классе объекта
myobject
3. Методы, определенные в предках класса объекта
myobject
Если найти метод
mymethod
method_missing
1.4.4 Сборка мусора
Управлять памятью на низком уровне трудно и чревато ошибками, особенно в таком динамичном окружении, какое создает Ruby. Наличие механизма сборки мусора — весомое преимущество. В таких языках, как C++, за выделение и освобождение памяти отвечает программист. В более поздних языках, например Java, память освобождается сборщиком мусора (когда объект покидает область видимости).