Блог

Ruby: Рефлексия

Знакомство с Ruby. Краткая информация про рефлексию. Методы которые позволят узнать всю поднаготную о текущем состоянии объекта или класса.В классе Object есть метод class, который возвращает имя класса экземпляра класса:

test = 'this is test'
test.class            
#=> String

Метод class вытесняет из Object осуждаемый метод type и получает имя класса в виде стори с помощью метода name:

test.class.name 
#=> String

Чтобы определить имя суперкласса –  родителя, который в иерархии классов стоит на одну ступень выше, метод superclass из класса Class/

test.class.superclass  #=> Object
String.superclass      #=> Object

Выяснить имена всех включенных модулей экземпляра класса или его класса, метод included_modules из Module.

test.class.included_modules           
#=> [Enumerable, Comparable, Kernel]
test.class.superclass.included_modules
#=> [Kernel]

У каждого объекта есть свой собственный id метод object_id.

Проверить, является ли объект экземляром данного класса, метод instance_of?

test.instance_of? String # => true

Рефлексия для переменных и констант

@wo = 'WHAT'           #=> "WHAT"
$yes = 'YES'           #=> "YES"
test = 'this is test'  #=> "this is test"

Определить локальные переменные, метод local_variables

local_variables   #=> ["_", "test"]

Вернем переменные экземляра при помощи instance_variables

instance_variables #=> ["@wo"]

Метод global_variables возвращает все глобальные переменные.

global_variables
# => ["$-w", "$:", "$.", "$KCODE", "$-F", "$*", "$stderr", "$,", "$`", "$binding", "$-p", "$\"", "$$", "$<", "$@", "$-v", "$-i", "$deferr", "$\\", "$=", "$;", "$PROGRAM_NAME", "$stdout", "$&", "$-d", "$LOAD_PATH", "$-a", "$VERBOSE", "$FILENAME", "$defout", "$-0", "$+", "$0", "$stdin", "$~", "$yes", "$DEBUG", "$-I", "$_", "$-K", "$>", "$/", "$'", "$-l", "$LOADED_FEATURES", "$?", "$SAFE", "$!"]

Метод constants из Module вернет все константы

Object.constants.sort
# => ["ARGF", "ARGV", "ArgumentError", "Array", "Bignum", "Binding", ...]

Рефлексия для методов
Метод methods из Objects возвращает список имен методов, доступных из объекта, включая методы, доставшиеся от предков объекта.

Object.methods.sort
# => ["<", "<=", "<=>", "==", "===", "=~", ">", ">=", "__id__", "__send__", "allocate", ...]

Запросить методы экземпляры класса с помощью метода instance_methods

Object.instance_methods.sort
# => ["==", "===", "=~", "__id__", "__send__", "class", "clone", ... ]

Можно делать запросы о методах с помощью методов из класса Object: private_methods, protected_methods, public_methods и singleton_methods. В Module также есть методы private_instance_methods, protected_instance_methods и publiс_instance_methods.

#!/usr/bin/env ruby
p Object.respond_to? :instance_methods

class Test
  attr_accessor :x
end

a = A.new

p a.respond_to? :x
p a.respond_to? :x=
p a.respond_to? :y

Result:
true
true
true
false

Ссылки
http://ruby-doc.org/
http://www.ruby-lang.org/
http://tryruby.org/
Ruby/Методика самопознания